一、指针
概念:当定义一个变量时,系统会为这个变量分配内存,比如,int a,系统会给变量a分配一块内存,大小为in型的4个字节,而且每个字节都会有一个编号,这个编号就是地址,这个编号是计算机抽象出来用于访问数据的,实际上为一个数字。当计算机需要访问数据时,会先找到它的地址,再来获取改地址里的数据。比如,int a=1;当计算机需要printf("%d",a)时,它会先找到a的地址(比如0x000001),然后找到a的值为1。而一个变量的地址就称为该变量的指针。指针就是一个地址,它在计算机中是一个内存单元的编号,一个十六进制数。
二、指针变量:c语言有很多种变量,每种变量都会储存一种数据,而指针变量就是专门来储存指针的变量,如定义一个指针变量p,p是一个指向int型数据的指针,即p可以存int型变量的地址。
int *p;
1.这里有两种访问数据的方式:
- 直接访问:就像上面所说,计算机先找到该变量的地址,再找到该变量的值
- 间接访问:与第一种不同,这里要用到两个变量,用一个变量2来储存变量1的地址,然后通过变量2来找到变量1的值
在函数传参时,在函数体里只改变型参的值,对实参不会造成影响,这里通过地址的传递可以对实参造成影响
*p1和*p2的值虽然都是2和1,但是原理不同。
在swap2函数里,*p1是通过b的地址找到了b的值,而此时a和b的值并没有交换所以*p1是2,*p1也是这样。
在swap1函数里,p1和p2的值(p1和p2的值是a和b的地址)没有改变,但在上面已经交换了a和b的值,所以*p1通过a的地址找到a的值为2。
2.指针的大小:指针的大小和指针本身没有关系,这是由CPU运行模式的寻址位数决定的
#include<stdio.h>
#include<windows.h>
int main()
{
int a;
int *p1;
float *p2;
double *p3;
char *p4;
printf("sizeof(p1):%d\nsizeof(p2):%d\nsizeof(p3):%d\nsizeof(p4):%d\n",sizeof(p1),sizeof(p2),sizeof(p3),sizeof(p4));
system("pause");
return 0;
}
输出结果:
可以看出无论是int型指针还是char型指针,大小都是4个字节。
三、二级指针
1.二级指针就是指针的指针,也就是说,一级指针变量用来存放变量的地址,但一级指针变量也是一个变量,它也有自己的地址,所以二级指针就是存放一级指针的地址的指针。