指针变量是专门用来存放内存地址的,存放其它变量的内存地址。
指针变量的初始化:
指针变量初始化,就是使这个指针变量指向另一个变量。
int i; int *p; p = &i; //&是取地址符,取到i的地址赋值给p
printf("*p = %d ", *p); // *是解引用符,把*p表示指针p指向的变量,即i
指针变量的“基类型":
基类型就表示指针变量里存放的内存地址所指向的变量可以是什么类型的。
如 int *a; *表示这个变量是一个指针变量, int表示这个变量只能存放int类型变量的内存地址。 指针变量a的数据类型是int*。
int a[5];
int (*p)[5] = &a; *表示p是指针变量, int [5]表示p只能存放int[5]数组的内存地址。指针变量p的基类型是int[5]
指针运算:
①指针自加:
int a[5];
int (*p)[5] = &a; //表示指针p向后移动一个单元,这个1的大小取决于指针的基类型,这儿基类型是int[5],+1就是移动 4个字节x5=20个字节
printf("p = %d ", p);
p++; //运行可知,p向后移动了20字节
printf("p = %d ", p);
②指针相减:
a 二个指针变量相减的结果是一个常量,而不是指针类型
b 二个指针变量相减的结果是二个地址之间元素的个数,而不是内存地址的个数
int main()
{
int a,b,c,k,j;
int *pa = &a; //int*类型指针 pa
int *pb = &b;
int *pc = &c;
k = pa - pb;
j = pa - pc;
printf("pa = %d
pb = %d
k = %d
", pa, pb, k);
printf("pa = %d
pc = %d
k = %d
", pa, pc, j);
system("pause");
return 0;
}
运行结果如图:
通过这个图我们也顺便能看出来,栈的生长方向确实是从上往下的。
指针pa指向的内存地址是6487596,指针pb指向的内存地址是6487592。内存地址相差4个字节,但是pa-pb却等于1,所以相差的是int型元素的个数1
指针pa指向的内存地址是6487596,指针pc指向的内存地址是6487588,地址相差8个字节,相减等于2。