在实际生活中,我们可以想象一下你有一个装满礼物的宝箱,但是你不知道宝箱具体是在哪里。这时候你有一张纸条,上面写着宝箱的地址。这个地址就想是指针,它指向了实际的宝箱。通过这个地址,你就可以找到宝箱并打开它,获取里面的礼物。
前言
通过生活中的例子,我们可以在编程中学习到指针的相关知识。指针是C语言中的一种数据类型,用于存储变量的地址。变量在内存中有自己的地址,指针变量则存储了该地址。
一、内存和地址
内存是计算机用于存储数据和程序的地方。每个内存单元都有一个唯一的地址,用于标识该内存单元。可以将其视为一列连续的存储单元,每个存储单元都有一个地址,可以通过这个地址访问和操作数据。
1.指针变量
指针变量存储了某个变量的地址,可以通过指针变量来访问这个变量。指针本身也在内存中有自己的地址,可以通过&运算符获取指针变量本身的地址。
int a = 5;
int* p = &a;
2.解引用操作符
解引用操作符用于访问指针所指向的变量或对象。解引用操作符使用星号(*)作为符号,放置在指针变量前面。当使用解引用操作符时,它会将指针变量指向的内存位置的值提取出来。
int i = 10;
int* p = &i;//将i的地址取出放在指针变量p里面
printf( "%d\n", *p );//通过解引用操作符可以得到i的值为10
除了用于访问指针所指向的对象的值,解引用操作符还可以用于修改指针所指向的对象的值。
int i = 10;
int *p = &i;
*p = 20;
printf("%d\n", i); //修改后的i的值:20
3.指针变量的大小
在C语言中,指针变量的大小在不同的系统架构上可能会有所不同。在大多数32位系统上,指针变量的大小通常为4个字节,而在64位系统上,指针变量的大小通常为8个字节。
3.1指针变量类型的意义
指针变量的类型决定了,对指针解引⽤的时候有多大的权限(⼀次能操作几个字节)。
比如: char* 的指针解引⽤就只能访问⼀个字节,而int* 的指针的解引用就能访问四个字节
4.指针加减整数
我们可以通过指针变量类型来决定跳过几个字节
我们可以通过这个例子看出,char*类型的指针变量跳过了一个字节,int*类型的指针变量跳过了四个字节,指针的变量的类型决定了向前或向后走的步长。
二、void*指针
在C语言中,void*
是一种通用指针类型,它可以指向任意类型的数据。该类型的指针可以被用于指向任何类型的对象,但不能直接用于进行间接解引用操作或进行指针的运算。
我们可以看一个例子
在上⾯的代码中,将⼀个int类型的变量的地址赋值给⼀个char*类型的指针变量。编译器给出了⼀个警告(如上图),是因为类型不兼容。而使⽤void*类型就不会有这样的问题。