C语言的int (*a)[10]等指针问题理解


C语言里面的指针确实有些难理解,我感觉用文字很难说清楚,直接用代码解释更清楚明白!


编译环境:win7 64位,Dev-C++(MinGW 32位C编译器,使用C89 C90的标准)





//函数指针
int (*a)(int);
//函数指针数组
int (*b[10])(int);
//函数指针,返回int指针
int *(*c)(int);

void main(){
	int i;

 	int * a1[10];
 	int *(*a2)[10] = &a1;
 	//a2的理解其实和a6一样,只不过最终的元素类型不一样,为了操作方便,还是主要测试a6

	int **b1[10];
 	int ***b2 = b1;//b1 b2的区别是++等
 	

 	int a3[10];
 	int *a4 = a3;//a3 a4的区别就是指针操作,比如++的结果可能不一样
 	int **a5 = &a4;
 	int (*a6)[10] = &a3;//a5 a6的区别 也是指针操作不一样
 	//难理解的是s6,分析s6很简单,但是怎么操作呢,请看后面的打印

 	char *s1[10] = {
 		"abc",
 		"def"
 	};
 	char **s2 = {
 		"abc",
 		"def"
 	};//这样定义编译不会报错,但是怎么操作s2呢?


	for (i = 0; i < 10; ++i)
	{
	    a3[i] = i;

	    //a6肯定是一个数组,既然是数组,一定可以用数组的操作方式([])操作
	    //a6[i] = a3 + 1; 编译不过	        
	} 	
	
	printf("%d\n", *(a6[0]));//
	printf("%d\n", **a6);//
	printf("%d\n", a3[5]);
	printf("%d\n", *(a6[5]));// 输出的随机数,错误
	printf("%d\n", (*a6)[5]);// 输出的是5,正确
	//从打印结果可以看到,a6其实就是a3的一个指针(a3本身也是一个指针),不信看下面的测试
	(*a6)[6] = 888;
	printf("%d\n", a3[6]);//输出888
	//我不知道还有没有a6的其他独有操作方法,如果没有我觉得就完全没必要写a6这种代码

	printf("*(a3 + 6) ---- %d\n", *(a3 + 6));// 输出888,正常,a3+1最终值 = a3 + sizeof(int)/机器位数
	printf("*((*a6) + 6) ---- %d\n", *((*a6) + 6));//意料之中,输出888
	printf("*(a6 + 6) ---- %d\n", *(a6 + 6);// 随机数 
	printf("**(a6 + 6) ---- %d\n", **(a6 + 6));// 0 不懂意义

	printf("%s\n", s1[0]);
	printf("%s\n", *s2);//这里会运行错误
	printf("%s\n", s2[0]);//这里会运行错误

 }


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值