博客ID:LanFuRen
C系列专栏:C语言重点部分 C语言注意点 C++基础 Linux 数据结构 C++注意点
声明等级:黑色->蓝色->红色欢迎新粉加入,会一直努力提供更优质的编程博客,希望大家三连支持一下啦
目录
int*p=&a;这里是把a的地址赋给了指针变量p,或者更明确一点是p是指向a的指针变量。
指针,可谓是C语言中重中之重的难点,所以我们会分几次来详解指针的所有的知识点。
1.指针的引入
我们住的宿舍都是有编码地址的,这样我们好找到我们的房间,例如602宿舍,我们就很容易通过602去找到该宿舍去串门哈哈哈。我们内存中所存储的数据,自然也就会有地址啦。那地址==编号==指针,指针就是这个意思。看张图更清晰。
2.指针变量相关内容
1)指针变量的概念
int*p就是一个指针变量,*代表p变量是指针变量,int代表指针变量的类型是整型。指针变量存储的是地址。
2)取地址操作符
在scanf函数中,我们就遇到过这个操作符&,意思是取出该变量的地址。
int a=1;
int*p=&a;这里是把a的地址赋给了指针变量p,或者更明确一点是p是指向a的指针变量。
3)解引用操作符
既然我们把a的地址取出来给了指针变量p,那么就可以通过指针变量经过操作访问a的空间,那就是解引用操作符*,这个*可不是int*p中的*,而是专门的解引用操作符,用来解析地址获得指向的空间内容。
int a=1;
int*p=&a;
printf("%d",*p);//输出的值就是a的值。
3.指针变量的大小
其实很多人会误解指针变量大小跟类型有关,其实不然。不管是int*,还是char*等其他类型,在32位环境下都是4字节,64位是8字节。我们可以用sizeof来看看运行结果是否与结论一致。
int main()
{
printf("%zd\n", sizeof(int*));
printf("%zd", sizeof(char*));
return 0;
}
既然如此,那给这样的不同类型有什么区别呢,一是保持与需要接受的变量的类型是一样的,一方面是,int*类型的指针变量一次性可以访问4字节,而cahr*只能一次性访问1字节。
代码1 | 代码2 |
| |
通过这两个代码查看内存就知道这个知识了。
左图1,右图2代码
正因为指针变量有如此操作,我们可以通过指针变量(指针)+-整数来前进或倒退来访问下一个地址。
结论:指针的类型决定了指针向前或者向后⾛⼀步有多⼤(距离)
4.void*指针
在指针类型中有⼀种特殊的类型是 void* 类型的,可以理解为⽆具体类型的指针(或者叫泛型指针),这种类型的指针可以⽤来接受任意类型地址。但是也有局限性, void* 类型的指针不能直接进行指针的+-整数和解引用的运算。