指针的介绍
在内存中,内存是被分成一个个内存单元的,每个内存单元都被分配有各自的编号,这些编号就相当于这些内存单元的地址,可以通过找到它们的地址,就可以对内存单元进行访问了,为了方便访问内存空间中的内容,在c语言中就出现了指针,指针是用来存放内存单元的地址的,我们可以通过该内存单元的地址“指向”的位置就可以访问内存单元中的内容了,这种“指向”内存单元的地址的东西,我们就把它称为指针,用来存放内存单元地址的变量称为指针变量。
取地址操作符(&)和解引用符号(*)
- 取地址操作符(&)
&该符号就是可以拿到一个变量的地址,也就是拿到该变量在内存中开辟的内存空间的地址
int main()
{
int a = 20;//变量创建的本质其实是向内存申请4个字节的空间,用来存放20这个数值
int *pointer_a = &a;//&a--取到 a的地址,这个地址是4个字节中最小的那个字节的地址
//pointer_a是一个指针变量,用来存放a的地址(指针)
//这个*表示pointer_a是指针变量,int表示pointer_a指向的变量a是整型int
//int*表示pointer_a的类型
return 0;
}
为了大家更好的理解,上面的代码表示出来是这样的:
0x0099fc74,相当于a的地址,将其放入指针变量pointer_a中存放,使该指针变量指向了a。
- 解引用符号(*)
int main()
{
int a = 10;
int *pointer_a = &a;
*pointer_a = 20;
printf("a = %d\n",a);//结果 a = 20
//该解引用操作符也叫间接访问操作符,对该指针变量指向的变量的内容进行修改或者获取
//*pointer_a的意思就是通过pointer_a存放的地址,然后找到该地址指向的空间,*pointer_a其实也就等价于a这个变量了
return 0;
}
指针变量的大小
- 32位平台下,地址是32个bit位,指针变量即4个字节
- 64位平台下,地址是64个bit位,指针变量即8个字节
所以指针变量的大小与类型无关,只跟环境有关
指针类型的意义
- 指针为(int*)类型的解引用操作
代码一:
下面是指针为(char*)类型的解引用操作
代码二:
两个代码进行比较可以看到char的指针解引用就只能访问一个字节,二int的指针解引用就能访问4个字节。
结论:指针的类型决定了指针对指针解引用的时候一次能操作几个字节
- 指针 ± 整数
可以看出,char类型的指针变量+1跳过了一个字节,int类型的指针变量跳过了4个字节
结论:指针类型决定了指针向前或者向后走一步是多大距离
int* pointer_a:pointer_a + n 相当于偏移 nsizeof(int) 个距离
char pointer_a:pointer_a + n 相当于偏移 n*sizeof(char) 个距离
字符指针变量
char *p = "abcdefg";
常量字符串,这里的赋值是将字符串中首字符的地址赋值给p
泛型指针和野指针
- 泛型指针
void*-----代表无具体类型的指针
可以接收任何类型的地址
void类型的指针不能进行解引用操作和指针 ± 整数的运算
- 野指针
野指针的定义:指针指向的定义是不可知的(随机的,不正确的,没有明确限制的)
野指针的成因:指针未初始化,指针越界访问,指针指向的空间被释放