指针的辨别

目录

一维数组

字符数组


#这里分析一些关于指针的题,能够帮助我们更好理解指针,适合新手入门,有助于我们在写代码时避免写出更多错误。

//一维数组
int a[] = { 1,2,3,4 };

printf("%d\n", sizeof(a));
printf("%d\n", sizeof(a+0));
printf("%d\n", sizeof(*a));
printf("%d\n", sizeof(a+1));
printf("%d\n", sizeof(a[1]));
printf("%d\n", sizeof(&a));
printf("%d\n", sizeof(*&a));
printf("%d\n", sizeof(&a+1));
printf("%d\n", sizeof(&a[0]));
printf("%d\n", sizeof(&a[0]+1));

//字符数组
char arr[] = { 'a','b','c','d','e','f' };//6

printf("%d\n", sizeof(arr));
printf("%d\n", sizeof(arr+0));
printf("%d\n", sizeof(*arr));
printf("%d\n", sizeof(arr[1]));
printf("%d\n", sizeof(&arr));
printf("%d\n", sizeof(*&arr));
printf("%d\n", sizeof(&arr+1));
printf("%d\n", sizeof(&arr[0]+1));
	

请思考结果;

下面开始分析:(分析中4/8表示32位和64位环境中分别占用4字节和8字节)

一维数组

printf("%d\n", sizeof(a));

结果为20;

a是整型数组名,表示首元素地址,但是有两个特例:

sizeof(数组名)表示数组大小;

(&数组名)表示整个数组地址;

例:

int ax[2][5] = { 1,2,3,4,5,6,7,8,9,10 };

printf("%d", *((int*)(&ax+1)-1));

sizeof(ax);

结果为:10,40;

(1)&ax为整个二维数组地址,以40个字节进行加减,转化为(int*)后以4个字节加减,(int*)(&ax+1)-1)指向ax[1][5],值为10;

(2)ax是二维数组名sizeof(ax)表示二维数组大小;(ax表示首元素地址,即指向第一行的指针,是个数组指针,所以二维数组可以用数组指针来接受)

	int ax[2][5] = { 1,2,3,4,5,6,7,8,9,10 };
	print_(ax);

	return 0;
}
void print_(int(*p)[5])
{
	for (int i = 0; i < 2; i++)
	{
		printf("\n\n\n%d %d %d %d %d", *(p[i]+0), *(p[i] + 1), *(p[i] + 2), *(p[i] + 3), *(p[i] + 4));
	}
	
}

 

printf("%d\n", sizeof(a+0));

a为首元素地址,a基类型为int,加减一个int类型4个字节,a+0指向a[0],但是sizeof是计算数据类型大小,由于是指针(地址)类型,不论是什么类型指针,在同一个环境中大小都是4/8Byte,所以结果为4/8

printf("%d\n", sizeof(*a));

*a解引用值为a[0]=1,结果为4,一个整型大小;

printf("%d\n", sizeof(a+1));

结果为4/8,指向a[1];

printf("%d\n", sizeof(a[1]));

*(p+i)和p[i]等价,所以解引用后a[1]值为2,为整型类型,结果4;

printf("%d\n", sizeof(&a));

&数组名,计算数组地址大小,结果为4/8;

printf("%d\n", sizeof(*&a));

*&a访问一个数组大小,或者sizeof(*&a)等价于sizeof(a),结果为20;

printf("%d\n", sizeof(&a+1));

结果为4/8,指向的值未知;

printf("%d\n", sizeof(&a[0]));

取出首元素地址,计算首元素地址大小,结果为4/8;

printf("%d\n", sizeof(&a[0]+1));

取出首元素地址,+1是第二个元素地址,结果为4/8;

字符数组

char arr[] = { 'a','b','c','d','e','f' };//6

字符数组包含6个字符,不含'\0';

printf("%d\n", sizeof(arr));

这个同样也很简单,计算数组大小,结果为6;

printf("%d\n", sizeof(arr+0));

结果为4/8;

printf("%d\n", sizeof(*arr));

arr只有sizeof(arr)形式时才时整个数组,*arr是首元素的值,结果为1;

printf("%d\n", sizeof(arr[1]));

计算第二个元素的大小,结果为1;

printf("%d\n", sizeof(&arr));

很简单,&arr是整个数组地址,计算结果为4/8;

printf("%d\n", sizeof(*&arr));

 *&arr计算数组大小,结果为6;

printf("%d\n", sizeof(&arr+1));

计算的是地址,但指向的值未知,结果为4/8;

printf("%d\n", sizeof(&arr[0]+1));

&arr[0]解引用加减以一个字节为单位,&arr[0]+1为第二个元素地址,结果为4/8;

验证:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值