c语言中,char* [ ]指针数组的用法以及如何取值探究

问题

  • 我们声明一个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又获取元素
					
				
								
}
  • 8
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Beiwen_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值