详解:C语言中的指针和p, p+1, *(p+1), *P+1, p[0], &p[0] 的含义

解析:C语言中的指针和p, p+1, *(p+1), *P+1, p[0], &p[0] 每一种表达式的含义

 一、先解决一个问题:什么是指针
指针就是存放地址的变量。很好,百度上就是这个答案(哈哈,感觉这句话很废话)。
指针是一个大小固定为4个byte的变量,不管是什么类型的指针大小都是固定的,因为存放是一个地址信息。
void main()  
{
	int a = 1;
	char b = 'a';
	int* i = &a;//指向一个int值变量
	char* c = &b;//指向一个char值变量		
}

从上面的程序中可以看出来,定义一个int类型的指针和char类型的指针,但它们的大小都是4byte,因为存放的是对应类型变量的地址而不是对应类型变量的内容。

二、指针P与指针P+1

void main()  
{  
      int a[] = {1,2,3,4};
      int* b = (int*)&a;
}


在上面的程序中定义一个int类型的指针(在这里要重点强调一下,这里是int类型的指针,对后面的内容的理解很重要),指针b的地址为0x0018ff38,指针b+1的地址为0x008ff3c,他们中间相隔了4byte,刚好是一个int类型的大小,而指针b又是一个int类型的指针,所以我们可以得出一个结论:

指针P+1 = 指针P + sizeof(指针的类型) *  1

三、数组和指针(刚好看到上面程序结果想到的一个点)

在上面的运行结果中,我们可以发现a[1]和*(p+1)得到的值是一样的,因为&a[1]指向的地址和P+1指向的地址是一致。

在C语言中获得数组的值有两种方法:

第一种:匿名方法   --> a[1]

第二种:具名+匿名方法  --> P + sizeof(数组类型)*1

四、*(P+1)和*P+1的不同之处

void main()  
{  
      int a[] = {1,4,3,4};
      int* p = (int*)&a;
}

其实这个问题很简单,因为*的优先级比+的优先级高,所以*P+1在编译器中是先取出p指向的int值然后加1,就是a[0]+1,也就是1+1,所以*p+1取出的值等于2。而*(P+1),因为多了一个括号,所以就变成指针P+1后,再取出里面的值,也就是a[1]的中的值,所以*(P+1)取出的值等于4。

五、*(P+1)和P[1]

也是用上面的程序,我直接上运行结果,一看就知道了


这大概是写法不同把,我个人的理解应该是跟上面第三点的两种取值方法原理相似。我做了以下的尝试

void main()  
{  
      int a[] = {1,4,3,4};
}

可以正常运行,没有报错,这里就证明我的一个猜想,定义一个int类型的数组a,可以直接把a当做一个指向数组a首地址的int类型的指针使用。这就是说,定义一个int数组其实编译器内部开辟一个内存块和指向首地址int类型的指针给我们。

到这里,最后一个&P[0]的含义就很明显了,可以看成取数组第一元素的地址。


文章很多地址均为本人用例子尝试后得到的结论,可能不是很正确,如果您发现有错误的地方,请在评论中指出,以免误导其它人,本人不胜感激。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章