首先,我们输出一个字符串都知道是用%s来输出,但是我们并没有多想是通过什么方式来输出的。

今天我在看指针数组的时候发现了一个问题,按就是定义一个字符类型的指针数组,

/*字符串的输出本身就需要他的地址,字符串没有单独的类型变量表示,只能用char类型数组来表示,指针数组所有空间存放的都是指针,所以在放字符串的时候,你这个字符串已经是一个地址了*/

我用一个通俗易懂的例子来说明一下:(你必须要知道的就是字符串的输出是要第一个字符的首地址)

刚刚说到每一个指针数组的空间都是用来存放地址的,所以不管你放什么进去这个数组都会默认你存了一个地址进去。

当你存放一个字符串进去的时候,也就是指针数组把你这个字符串的地址放进去了,存进去了,这时候第i个元素是字符串的地址,用的时候直接p1[i]就可以了

现在你再看代码,对于在指针数组里面的字符串为什么在输出的时候不用*p1[i]而是用p1[i], 因为你, 因为在指针数组中p1[i]中第i个元素就是字符串的地址,那么为什么用*(p1+i)也可以呢,因为你这个数组是指针,使用指针的时候既可以*(p1+i),也可以p1[i], 这应该是学习到指针都应该知道的事情。

#include<stdio.h>
int main()
{
char *p1[5] = { "s你是大帅比",
"s嗨害!",
"s鸡汤别来",
"keep going",
"s栓Q了"
};
int i;
for(i = 0; i < 5; i++)
{
printf("%s\n", *(p1 + i));//*(p1 + i) 和 p1[i]一样,因为输出字符串时用字符串中第一个字符的地址来输出的
} return 0;
}

/*用指针数组输出数字的时候就是要用*p1[i] , 因为每一个空间对应的是变量的地址 ,输出数字不能用地址,而是要用地址去寻找这变量对应的值*/

如:

#include<stdio.h>
int main()
{
int a = 1, b = 2, c = 3, d = 4, e = 5;
int *p2[5] = {&a,&b,&c,&d,&e};
int i; for(i = 0; i < 5; i++)
{
printf("%d\n", **(p2 + i));//**(p2 + i) 与 *p2[i]一样
} return 0;
}

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

总结:对比下来,简而言之就是看你输出的需求,字符串输出就是要地址,数值要的是变量。地址是不需要继续取地址符,而你输出数值的时候,但是你放进去的是地址,输出是数值,自然不能直接用地址,要用地址所指向的那个变量空间。

C语言(较深入原理):%s通过字符串首元素地址输出,用指针数组来作示例的更多相关文章

  1. 【嵌入式开发】C语言 指针数组 多维数组

    . 作者 : 万境绝尘 转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/21402047 . 1. 地址算数运算示例 指针算数运算 ...

  2. 【嵌入式开发】C语言 内存分配 地址 指针 数组 参数 实例解析

    . Android源码看的鸭梨大啊, 补一下C语言基础 ... . 作者 : 万境绝尘 转载请注明出处 : http://blog.csdn.net/shulianghan/article/detai ...

  3. C语言 指针数组 多维数组

    . 作者 : 万境绝尘 转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/21402047 . 1. 地址算数运算示例 指针算数运算 ...

  4. C语言 内存分配 地址 指针 数组 参数 实例解析

    . Android源码看的鸭梨大啊, 补一下C语言基础 ... . 作者 : 万境绝尘 转载请注明出处 : http://blog.csdn.net/shulianghan/article/detai ...

  5. C++语言中数组指针和指针数组彻底分析

    #################################                              ##       基本知识               ##        ...

  6. C语言学习笔记--数组指针和指针数组

    C 语言中的数组有自己特定的类型,数组的类型由元素类型和数组大小共同决定.(如 int array[5]类型为 int[5]) 1.定义数组类型 C 语言中通过 typedef 为数组类型重命名:ty ...

  7. C语言--- 高级指针2(结构体指针,数组作为函数参数)

    一.结构体指针 1. 什么是结构体指针?指向结构体变量的指针     结构体:     typedef  struct stu{                          char name[ ...

  8. C语言-数组指针与指针数组

    1.思考 下面这些声明合法吗? int array[5]; int matrix[3][3]; int * pa = array; int * pm = matrix; 问题: array代表数组首元 ...

  9. GO语言的进阶之路-Golang字符串处理以及文件操作

    GO语言的进阶之路-Golang字符串处理以及文件操作 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 我们都知道Golang是一门强类型的语言,相比Python在处理一些并发问题也 ...

  10. Atitit.加密算法 des  aes 各个语言不同的原理与解决方案java php c#

    Atitit.加密算法 des  aes 各个语言不同的原理与解决方案java php c# 1. 加密算法的参数::算法/模式/填充 1 2. 标准加密api使用流程1 2.1. Md5——16bi ...

随机推荐

  1. java中DelayQueue的使用

    目录 简介 DelayQueue DelayQueue的应用 总结 java中DelayQueue的使用 简介 今天给大家介绍一下DelayQueue,DelayQueue是BlockingQueue ...

  2. Numpy通用函数及向量化计算

    Python(Cpython)对于较大数组的循环操作会比较慢,因为Python的动态性和解释性,在做每次循环时,必须做数据类型的检查和函数的调度. Numpy为很多类型的操作提供了非常方便的.静态类型 ...

  3. java excel关联导入数据格式为一对多

    java excel关联导入数据格式为一对多 java 表格读取时一行一行的读取 将每行数据放入list  根据 list.stream().filter(m->m.getCode().equa ...

  4. DevEco Hvigor高效编译,构建过程新秘籍

      作者:Lewei,华为终端BG编译构建技术专家 DevEco Hvigor是使用TypeScript语言开发的全新轻量化的任务调度工具,针对HarmonyOS应用提供了一系列编译构建任务,支持将H ...

  5. leetcode:3. 无重复字符的最长子串

    3. 无重复字符的最长子串 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度. 示例 1: 输入: "abcabcbb" 输出: 3  解释: 因为无重复字符的最长子 ...

  6. eclipse 卡顿的优化办法

    1. 关闭校验 2. 关闭插件自动升级 3.关闭界面设置的一些选项

  7. 力扣1346(java&python)-检查整数及其两倍数是否存在(简单)

    题目: 给你一个整数数组 arr,请你检查是否存在两个整数 N 和 M,满足 N 是 M 的两倍(即,N = 2 * M). 更正式地,检查是否存在两个下标 i 和 j 满足: i != j 0 &l ...

  8. EventBridge 事件总线及 EDA 架构解析

    ​简介:EventBridge 是事件驱动的具体落地产品,也是 EDA 的最佳实践方式. 作者:肯梦 作为 Gartner 定义的 10 大战略技术趋势之一,事件驱动架构(EDA)逐渐成为主流技术架构 ...

  9. 冬奥幕后故事:从低碳火炬到AI裁判,十四年后中国科技再上场

    ​北京冬奥会开幕后,一个段子在社交媒体上流传甚广:"夏奥开幕式和冬奥开幕式就差半年,这半年人类科技进步真大啊." ​ 文|张婧怡 封面来源|北京日报客户端 冬奥季终于到来. 2月4 ...

  10. [FAQ] uni-app 运行微信小程序 main.wxss 报错 unexpected token "$"

    检查一下你是否在 App.vue 中有手动操作引入过 uni.scss,比如下面的 import: <style lang="scss"> @import url(&q ...