C语言对于指针p,*p,&p的理解

定义一个整形指针p:

int *p;
  • p:p是一个变量,但它与普通整型变量不同。普通整型变量一般用来保存一个数值,p 保存的也是一个数值,但这个数值代表地址,这个地址可以改变。
  • *p:*p是取p对应的地址里的数据 。
  • &p:因为p是一个变量,所以就要有内存空间来保存这个变量,这就是&p,&符号代表取地址

我们进行如下操作:

#include "stdio.h"

int main()
{
	int i;//定义循环变量
	int a[] = {1,3,5,7,9};//定义一个数组
	int *p = a;//将指针指向该数组

	printf("数组 a 的地址为 %p\n", a);//输出数组a的地址
	printf("存放 p 的地址为 %p\n", &p);//输出&p,也就是存放指针p的地址

	for(i = 0; i < 5; i++)
	{
		printf("%p 地址存放 %d\n", p, *p);//输出数组的每个元素及存放该元素的地址
		p++;
	}
	printf("\n");

	return 0;
}

运行结果:
C语言对于指针p,*p,&p的理解_第1张图片
从运行结果来看,在内存中有这样一块区域:

地址 数据 地址 数据
0019FF00 0019FF18 1
0019FF04 0019FF1C 3
0019FF08 0019FF20 5
0019FF0C 0019FF24 7
0019FF10 0019FF28 9
0019FF14 0019FF18 0019FF28

其中0019FF14为存放指针变量p的地址,也就是&p=0019FF14。
该地址的数据为0019FF18,也就是p=0019FF18,找到与该数据相同的地址,在右侧第一行,该地址的数据为1,也就是*p此时=1。
之后每次循环p++,由于p是整型指针,所指向的数据占4字节,编译器会对+的变量乘以4,也就是每次+4,这样对0019FF18地址+1结果指向0019FF1C,以此类推。

你可能感兴趣的:(C语言,地址,指针,c语言)