C语言(较深入原理):%s通过字符串首元素地址输出,用指针数组来作示例
首先,我们输出一个字符串都知道是用%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;
}
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
总结:对比下来,简而言之就是看你输出的需求,字符串输出就是要地址,数值要的是变量。地址是不需要继续取地址符,而你输出数值的时候,但是你放进去的是地址,输出是数值,自然不能直接用地址,要用地址所指向的那个变量空间。
本文来自博客园,作者:竹等寒,转载请注明原文链接。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析