C语言指针的高档操作,你掌握吗?

指南针是C语言中杀关键之数据类型,如果你说C语言中除去指针,其他你都学得甚好,那尔干脆说没学了C语言。究竟什么是指针也?我们事先来拘禁一个概念。

一直引用

  1. 遥想一下,之前我们是什么样转某个变量的价值?

我们事先是通过变量名来直接引用变量,然后开展赋值:

char a;a = 10;

  1. 看起来是死简短,其实程序中是怎么操作的啊?

实则,程序对变量的读写操作,实际上是针对性变量所当的囤空间拓展摹写副或取出数据。就地方的代码而言,系统会活动将变量名a转换为变量的存储地点,根据地方找到变量a的蕴藏空间,然后再次用数据10盖2进制的形式放入变量a的贮存空间受到。

3.
透过变量名援变量,由系统自动就变量名和那个储存地点间的变,称为变量的”直接引用”方式

回到顶部

一律、什么是指针?

1.咱们都明白,”直接引用”是直接通过变量名来读写变量

2.C语言中还有平等栽”间接引用”的措施(以变量a为例):首先以变量a的地址存放于其余一个变量中,比如存放于变量b中,然后通过变量b来间接引用变量a,间接读写变量a的价。这即是”间接引用”。

要是程序通过”间接引用”的章程来修改a的价,可以这么做:先根据 变量名b 获取
变量b
的地点ffc2,取出变量b中贮存的情ffc1,也就是是变量a的地方,再冲变量a的地方ffc1找到a的储存空间,然后修改中的数。

3.总一句:用来存放变量地址的变量,就叫”指针变量”。在点的情景下,变量b就是独”指针变量”,我们可说指针变量b指为变量a。

返顶部

亚、指针的概念

一般式:类名标识符 *指南针变量名;

int *p;float *q;

“*”是一个说明符,用来证实是变量是独指针变量,是勿能够大概的,但它不属变量名的如出一辙有些

前的种类标识符表示指针变量所对的变量的品类,而且只能依赖于这种类型的变量

返顶部

老三、指针的初始化

1.先定义后初始化

1 // 定义int类型的变量a2 int a = 10;3 4 // 定义一个指南针变量p5 int *p;6
7 // 将变量a的地址赋值给指针变量p,所以指针变量p指向变量a8p = &a;

专注第8履行,赋值给p的是变量a的地址&a

2.每当概念的还要初始化

// 定义int类型的变量aint a = 10;// 定义一个指南针变量p//
并以变量a的地点赋值给指针变量p,所以指针变量p指向变量aint *p = &a;

3.初始化的令人瞩目

指南针变量是因此来存放变量地址之,不要受她轻易赋值一个常数。下面的写法是谬误的

int *p;p = 200; // 这是荒谬的

回到顶部

季、指针运算符

1.于指针指向的变量赋值

1 char a = 10;2 printf(“修改前,a的值:%d”, a); 3 4 //
指南针变量p指向变量a 5 char *p = &a; 6 7 //
通过指针变量p间接修改变量a的值 8 *p = 9; 9 10
printf(“修改后,a的值:%d”, a);

描述

当次刚实施完毕第5尽代码时,内存中大约的分布情况是如此的

,a值是10,p值就是变量a的地址ffc3。

在意下第5、第8实施,都发出个”*”,它们的意义是勿相同的:

(1) 第5行的”*”只是用吧明p是独指针变量

(2)
第8行的”*”是一个指南针运算符,这里的*p代表根据p值ffc3这个地址访问对应的蕴藏空间,也即是变量a的蕴藏空间,然后以右手边的数值9描绘副到这蕴藏空间,相当给
a = 9;,于是内存中就成这样了

出口结果吗:

,可以窥见,我们经过变量p间接修改了变量a的价值。

2.取出指针所依赖为变量的值

指南针运算符除了可赋值之外,还可用于取值

1 char a = 10;2 3 char *p;4 p = &a;5 6 char value = *p;7
printf(“取出a的值:%d”, value);

输出结果:

,第6行中的*p的意思是:根据p值(即变量a的地址)访问对应的存储空间,并取出存储的始末(即取出变量a的价),赋值给value

3.动注意

当指针变量没有针对性确定地点之前,不要对它所指的情节赋值。下面的写法是荒唐的

int *p;*p = 10; //这是谬误的

应当于指针变量指向一个确定的变量后更展开赋值。下面的写法才是是的

// 定义2单int型变量int a = 6, b;// 定义一个对准变量b的指针变量pint *p;p
= &b;// 将a的价赋值给变量b*p = a;

五、指针的用处举例

1.例子1

面前我们由此指针变量p间接访问了变量a,在稍人看来,觉得指针变量好傻B,直接用变量名a访问变量a不就哼了么,干嘛搞这么麻烦。别着急,接下去举个例子,让大家看看指针还会召开什么工作。

如今出个要求:写一个函数swap,接收2单整型参数,功能是相互换个别独实参的价。

1> 如果无学过指针,你或会见这么形容

1 void swap(char v1, char v2) { 2 printf(“更换前:v1=%d, v2=%d”, v1,
v2); 3 4 // 定义一个中变量 5 char temp; 6 7 // 交换v1和v2的值 8 temp =
v1; 9 v1 = v2;10 v2 = temp;11 12 printf(“更换后:v1=%d, v2=%d”, v1,
v2);13 }14 15 int main()16

描述

出口结果:

,虽然v1和v2的值为换成了,但是变量a和b的价值根本就是没换过来。因为基本数据列作为函数实参时,只是纯粹地用价值传递让形参,形参的反并无影响实参。

咱得概括分析一下以此历程:

* 在第20实施被,将变量a、b的值分别传递给了swap函数的鲜单显示参v1、v2

* 在第8尽被,将v1的值赋值给了temp

* 在第9实行遭,将v2的价赋值给了v1

* 在第10履行被,将temp的价赋值给了v2

纵然如此,v1和v2的价值为换成了,但是a和b的价一直还不曾转

2> 如果学了指针,就相应这么勾画

1 void swap(char *v1, char *v2) { 2 // 中间变量 3 char temp; 4 5 //
取出v1指向的变量的值 6 temp = *v1; 7 8 //
取出v2指向的变量的价,然后赋值给v1指向的变量 9 *v1 = *v2;10 11 //
赋值给v2指向的变量12 *v2 = temp;13 }14 15 int main()16

事先瞧输出结果:

,变量a和b的价值终于换过来了。

解释一下:

(在16各类编译器环境下,一个指南针变量占用2个字节)

*
先注意第20实践,传递是变量的地点。因此swap函数的显示参v1指向了变量a,v2指于了变量b

*
第6尽代码是取出v1指向的变量的价,也便是变量a的值:10,然后赋值给变量temp

* 第9执行代码是取出v2指向的变量(变量b)的价值,然后赋值给v1指向的变量(变量a)

* 第12执代码是用temp变量的价值赋值给v2指向的变量(变量b)

信任你早已感受及指针的强有力了,如果没有指针,在一个函数的内根本改观不了表面的实参。

2.例子2

通下去再推一个指针的实用例子。默认情况下,一个函数只能发出一个归值,有矣指针,我们可兑现函数有”多返回回值”。

现发出个要求:写一个函数sumAndMinus,可以又计算2独整型的及和差,函数执行了后,返回跟同不同(注意了,这里而回来2只价)

// 计算2个整型的跟及差int sumAndMinus(int v1, int v2, int *minus) { //
计算差,并赋值给指针指向的变量*minus = v1 – v2; //
计算和,并回跟return v1 + v2;}int main(){ // 定义2单int型变量int a =
6, b = 2; // 定义2只变量来分别收受及和差int sum, minus; // 调用函数sum =
sumAndMinus(a, b, &minus); // 打印及printf(“%d+%d=%d”, a, b, sum); //
打印差printf(“%d-%d=%d”, a, b, minus); return 0;}

片描述

输出结果:

,和和不同且是因为与一个函数计算并回下。和是函数的第一手回值,差是通过函数的第3个指针参数间接返回。

为此产生矣指针,我们得以让函数有”无限个”返回值。

回去顶部

六、关于指针的疑问

恰学完指针,都或发生同样雅堆的疑惑,这里自己排有几乎单大的困惑吧。

1.一个指针变量占用小个字节的内存空间?占用的上空是否会面跟所依靠于变量的档次而反?

于同等种编译器环境下,一个指南针变量所占据的内存空间是原则性的。比如,在16各类编译器环境下,任何一个指针变量都只是占2单字节,并无会见依照所依为变量的色而改。

2.既每个指针变量所占据的内存空间是如出一辙的,而且蕴藏的还是地方,为何指针变量还要分类型?而且只能凭借为同一栽档次的变量?比如凭借于int类型的指针、指向char类型的指针。

实际,我看是问题与”数组为什么而分类型”是一律的。

* 看下面的代码,利用指针p读取变量c的价值

1 int i = 2;2 char c = 1;3 4 // 定义一个指向char类型的指针5 char *p =
&c;6 7 // 取出8 printf(“%d”, *p);

这个输出结果应该难不倒大家:

,是足以成功读取的。

*
如果我转一下第5实施的代码,用一个照应该针对int类型变量的指针p,指向char类型的变量c

int *p = &c;

咱重来拘禁一下出口:

,c的原值是1,现在得到下也是513,怎么回事呢?这个要基于内存来分析

因变量的定义顺序,这些变量在内存中盖如下图排布:

里面,指针变量p和int类型变量i各占2个字节,char类型的c占一个字节,p指向c,因此p值就是c的地点

1> 最初的下,我们用char
*p指向变量c。当使用*p来获取变量c的值经常,由于指针p知道变量c是char类型的,所以会打ffc3这个地点开始读取1单字节的数额:0000
0001,转为10进制就是1

2> 后来,我们用int
*p指向变量c。当使用*p获取变量c的值经常,由于指针p认为变量c是int类型的,所以会起ffc3这个地址开始读博2个字节的数码:0000
0010 0000 0001,转为10进制就是513

看得出,给指针分类是何等重要之一律宗事,而且同种指针最好但靠于平等栽档次的变量,那是太安全的。