C语言指针

C语言指针

地址

我们想去一个地方,可以通过这个地方的名字来找,比如“中餐厅”,也可以通过这个地方的地址来找,比如“xx路xxx号”。
在编程当中,我们可以通过变量名来访问变量的数据,也可以通过地址来访问。

C语言指针

:这两个地址08和0C相差4个字节也就是32位,1在内存中展现为 28个0 0001,int型就是4个字节

&是运算符,叫做取址符,用于去除变量对应的地址
*号是运算符,用于取出地址中存放的数据

其实指针就是地址
指针=地址

不同的数据类型
Int 存放的是整数
Char 存放的是字符
Int array【】 数组,存放的是一串数据
Int *p; 指针,存放的是地址

如何定义执政指针,以下两种都可以
C语言指针
C语言指针
要知道的是,指针也是变量的一种类型,只是定义的时候需要加一个 *。实际变量名是不带 * 的。
只有在定义指针的时候是一个标识符,其他时候都是运算符,表示乘法
或取内容的运算如printf(“%d”,
(&a));

用指针访问变量

C语言指针

指针访问int、char型,指针的自加

C语言指针

这里的++p表示先自加再调用输出。
可以看到指向a的地址的指针自加后指针后移了四个字节,这是因为int类型占4个字节
指向c的地址的指针自加后指针后移了一个字节,这是因为char类型占1个字节
这里的指针自加可以想象成游标卡尺一段段的后移。

指针与数组

C语言指针
在实际编写过程中,定义完指针,给指针变量赋的值应该是地址,所以不能漏掉取址符&
在使用完指针遍历数组输出后,如果还要使用这个指针,应注意指针归位,否则溢出数组的范围会造成出现乱码(随机数据)的现象。

练习:输入三个数据(任意数量)找最大最小算平均,用指针优化 函数体

C语言指针
Main函数
C语言指针
运行结果
C语言指针

注意要点是:
指针用完,下一次再用的是哦胡要注意归位,否则会出现数组溢出
在函数中定义了一个指针变量作为形式参数,在主函数传递时传递的应是地址或相应指针变量
在数组中,相邻元素的地址是连续的(相隔相应类型所占字节,如int就是4bit,指针自加时也会跳转相应的地址所占字节个数),在使用指针(地址)表示数据时,除了注意自加,还不能忘记加上 * 表示指针所指地址中所存放的数据。
使用完指针注意自加,再循环体内要注意自加的位置。

为什么要用指针

C语言可以通过指针将数据存放在想要的地址当中,这是其他语言没有办法做到的
C语言指针

int *p2=(int *)0x0060FEF4;//先将这个地址强制转换,告诉编译器这个地址上将存储一个int类型

//没有强制转换则系统不知道要存什么类型,就不能直接存,*(0x0060FEF4)=10;是错的

*p2 = 10;//p2指针指向地址,用 * 取值,即将10存放再这个地址

//上方两句也可写成 *(int *)0x0060FEF4=10;

要点就是要掌握上方的这些。

地址需要加上 * 符号作为取址符才能访问它所存放的数据,而这里是标识符。

指针定义中int* p;p是指针即地址,int *表示地址中存放的数据是int型,加上括号 (int *)地址 强制转换,和(float)是一个道理。

需要强制转换才能存放数据的原因:

我们不知道我们想要用的地址是否已经存了别的数据,存的数据是什么类型,所以需要强制转换再使用。

这样交换,a和b并没有缓过来,思考为什么?

C语言指针
而用指针的方式可以交换
C语言指针
把他简化一下
C语言指针

可以看到a的值在函数中发生了变化,但是在输出时还是10.

这是因为在函数体运行中,当输出完a的值,函数运行结束,函数体内的东西都会被清空。

在主函数中,a=10会存在某个地址,函数体当中,a的值会存放再另一个地址。当函数运行结束,存放函数体的a的地址会被释放。所以没有改变主函数的a的值。

C语言指针

在函数中,对p修改就是对(0x0060FF08)进行修改。

——理解为:p是存放地址的指针变量,p就是0x0060FF08,两者是等价的,对p修改就是对(0x0060FF08)进行修改,只是指针变量p存放在0x0060EFE4这个地址,在函数执行完后,这个地址释放,而主函数中a的值能够修改。

第一种情况有两个地址,两个10;第二种情况传递的是10的地址,只有1个10.

这里再回顾指针的定义,int *p;

定义时的*作为标识符,表示这里定义的是指针变量,这个指针变量的变量名是p,用于存放一个地址—— p=&a;这里&是取址符。

P是地址,不是数据,如果要读取或改变p中的数据需要加上 * 。printf(“%d”,*p);