C语言细节操作 &a+1 (两图解决一切)

一件有趣的事情;

表达式中 如果出现  &a+1,究竟加多少,二话不说直接上图说明一切!!!!

C语言细节操作 &a+1 (两图解决一切)_第1张图片

总结!!!

        当表达式 中出现 int p=&a+1的时候,  +1所加的大小  是 a所占的大小;

                即&a, 得到不仅仅是a的地址,还有a的类型;这个借助指针的赋值来理解;当我们创建一个指针时,是这样创建的

int a=10;
int* p=&a;

理所当然, 当我们正常定义一个 指针时,&a的类型应当也属于 int*;而当我们将&a强制转换成(char*)类型的时候,由指针的加减可得,(char*)&a+1,加的就是1个字节 (char所占的大小)

                对于数组  若int p=&arr+1       所加的大小就是 整个数组arr所占的大小;

                当然如果 直接 int p=arr+1      因为数组名称本就是首元素的地址,+1理所当然是数组元素的大小

最后附上代码,和数组图片,帮助大家进行更好的记忆

C语言细节操作 &a+1 (两图解决一切)_第2张图片

补充: 

        1. sizeof(数组名),计算整个数组的大小, sizeof内部单独放一个数组名,数组名表示整个数组。
        2.&数组名,取出的是数组的地址。&数组名,数组名表示整个数组。

除此1,2两种情况之外,所有的数组名都表示数组首元素的地址。

 

int main() {
	int a = 2;
	int arr[10] = { 0 };
	int p = 0;
	printf("(int*)          &a==%d\n", &a);
	p = &a + 1;
	printf("(int*)          &a+1==%d\n", p);
	p = (char*)&a + 1;
	printf("((char*)        (char*)&a+1==%d\n", p);
	printf("\n");

	printf("(int arr[10])   &arr==%d\n", &arr);
	p = &arr + 1;
	printf("(int arr[10])   &arr+1==%d\n", p);
	printf("(int arr[10])   arr==%d\n", arr);
	p = arr + 1;
	printf("(int arr[10])   arr+1==%d\n", p);

	p = p + 1;
	printf("(int p)         p+1==%d", p);

	return 0;
}

你可能感兴趣的:(C语言学习记录,经验分享,其他,c语言)