指针
指针是用来保存变量地址的变量,在32位操作系统下指针有4个字节,而在64位操作系统下指针有8个字节
指针保存的地址与该地址对应的变量间的关系就好比钥匙之于锁,门牌号之于房间, 我们可以通过钥匙打开相应的锁,通过门牌号找到对应的房间
通过指针与变量之间的关系特点,我们可以通过操作指针实现各种应用,具体应用可以在其他地方找到
下面主要是关于一级指针;二级指针;指针数组和数组指针的理解
一级指针
下面看一段简单的代码
int main()
{
int a = 10;
int *pa = &a;//取a的地址并赋给指针pa
printf("%p\n", &a);//打印a的地址
printf("%p\n", pa);//pa的内容是a的地址
printf("%d\n",*pa);//*解引用得到a,此时*pa就是a
printf("%d\n", a);//打印a的值
system("pause");
return 0;
}
二级指针
一级指针的值是地址,这个地址做为一个值亦需要空间来存放,是空间就具有地址 ,二级指针就可以保存一级指针的地址,也可看做地址的地址
二级指针分为两类:
1.指向指针变量的指针:
int main()
{
int a = 10;
int *pa = &a;//取a的地址并赋给指针pa
int **ppa = &pa;//取一级指针pa的地址并赋给二级指针ppa
//下面这三条语句都打印a的地址
printf("%p\n", &a);//打印a的地址
printf("%p\n", pa);//打印pa的内容
printf("%p\n", *ppa);//打印ppa解引用后的内容
//下面这两条语句都打印pa的地址
printf("%p\n", &pa);//打印pa的地址
printf("%p\n",ppa);//打印ppa的内容
//下面这三条语句都打印10
printf("%d\n", a);
printf("%d\n",*pa);//*解引用得到a,此时*pa就是a
//ppa两次解引用得到a,第一次解引用得到pa的内容,也即是a的地址
//第二次解引用得到a的内容,也就是10
printf("%d\n", *(*ppa));//根据操作符优先级这里括号可省略
system("pause");
return 0;
}
输出显示:
2.指向数组的指针:
在C语言中,数组与其它变量在使用上有很大的不同.无论是字符型、整型、实型变量,还是结构体类型或者指针类型的变量,语句中出现变量名都代表对该变量所在内存单元的访问,变量名代表整个变量在内存中的存储单元,可以向该变量赋值,也可以从中取出数据使用.但是定义一个数组之后,数组名并不代表整个数组所占据的内存单元,而是代表数组首元素的地址
指针数组&数组指针
指针数组是一个数组,数组元素由指针组成:
它有5个指针类型的数组元素。这里执行b+1时,则b指向下一个数组元素
int main()
{
//这是一个指针数组
//此数组里的每一个元素都是字符串,可以用指针数组来保存
//其中每个元素都隐式转化为指针
char *b[5] = { "aaa","bbb","ccc","ddd","eee" };
}
数组指针是一个指针,指针指向一个数组:
b是一个指针,指向一个字符型的一维数组,这个一维数组的长度是5,也是b的步长。也就是说执行b+1时,b要跨过5个字符型数据的长度
int main()
{
char a[5];
//b是一个数组指针,该指针指向一个含有5个元素的数组
char(*b)[5] = &a;//注意这里的括号
printf("%p\n", b);
printf("%p\n", &a);
}
输出结果: