问题
- 我们声明一个char* name[] = { “aaa”, “bbb”,“ccc”,“yibijo”,“suagsui” }的时候,到底该如何取出里面的变量?
- 几次*分别取到的是什么?
- 和普通数组的用法到底有什么不同?
下面跟着我的思路来看看吧
分析全部写在代码块注释里了,复制阅读+配合运行实用效果更佳哦
#include<stdio.h>
int main() {
char* name[] = { "aaa", "bbb","ccc","yibijo","suagsui" };
char** p;//指针
int i;
//1、首先 需要明确的一点是 name这个数组里面存的确实是指针
//因为所有的指针变量都是4个字节 用sizeof(name)去验证发现是8
//2、其次 以下两行等同 都能取到aaa 那么是否c语言printf中存在直接
//从地址转到对应数值的机制呢?
printf("%s\n", name[0]);
printf("%s\n", *name);
printf("--------------------\n");
//3、用取m的地址来尝试一下
char m='m';
printf("%p\n", &m);//取出m的地址 运行输出0061FF07
//ps.小伙伴们用自己的输出结果哦
//(用%p取十六进制地址是最严谨的,之后前面加上0x就可以);
//如果想用%x也可以,但是前面要补上两位0
printf("%d\n", 0x0061FF07);//能做到的是把这个地址转化成十进制数的形式
//运行输出了6422279
printf("%c\n", *(char *)(6422279)); //强制转成char指针的形式,
//告诉计算机我是一个地址;可以发现必须还要*来取值才能得到m
//但是这个是单个char,不涉及指针形式,不能很好的得出结论
printf("--------------------\n");
//4、用字符数组尝试一下?
char *str="poiu";
printf("%p\n", str);//本身就是指针
//也就是poiu对应的地址-把他获取出来
printf("%d\n", 0x00406080);//操作同上文
printf("%s\n", (char *)(4219008)); //不二次加*,这个操作直接输出了poiu——
//说明,给地址是可以直接打印出来的!!
printf("等同于");
printf("%s\n", str);//本身就是指针,也就是poiu对应的地址-把他获取出来
printf("%c\n", *(char *)(4219008)); //再用*对地址取值,成功输出了p
//——也就是字符串取首地址
printf("等同于");
printf("%c\n", *str);//注意这个时候不可以%s和*str,因为本身是char指针类型,
//*char的时候只可能指向一个字符
printf("--------------------\n");
//5,上面进行了一系列探究,*name/name[0]和str是完全一样的概念,
//本身就是指针,%s可以成功打印出来对应值而已
printf("%s\n", *name);//name—数组首元首地址,*取出来——
//也就是打印数组的首元——又%s自动把字符串打出来
printf("%p\n", *name);//打印十六进制地址
printf("%d\n", 0x00406044);//把这个地址十进制化
printf("%s\n", (char *)(4218948)); //输出的是aaa,同*name
printf("%c\n", *(char *)(4218948));//*取值, 输出a
//一切满足结论,跟下面一行语句结果一样
printf("%c\n", **name);//*name是首元,指向了aaa,再对aaa做*取值操作,
//得到的就是该字符串的首元a
//6、另一个思路:本身是二重char型指针,两次**必定得到的是char;
//总结 涉及char是可以直接由地址%s取到对应变量的,之前int之类的不行
printf("--------------------\n");
int test[]={1,2,3};
printf("%d\n",*test);//对数组名再*才能得到对应的元素
printf("%d",test); //这条语句获取1元素的地址
//而printf("%p\n", *name);既获取地址,改成%s又获取元素
}