c语⾔指针使⽤的注意问题
c语⾔以前没学好重看c语⾔中最重要的指针概念,这是我这次重新学习指针发现的问题,概念不说只说我遇到的问题有点幼稚呵呵废话少说进⼊正题
1 关于指针变量的赋值问题
⽰例1 int *p
*p=*p1;
*p1=*p2;
*p2=*p;
由于*p是指针变量p所指向的变量,由于p中并⽆确定地址,所以这样的赋值可能会破坏系统的正常⼯作状态,这样的问题出现在编写⼦函数需要有⼀个变量来过渡两个或者多个指针变量的过程中,由于*p有可能指向系统中某个有⽤的单元,所以这样的赋值会损失数据
⼤家可以这样做⼀个实验随便声明⼀个⼀个指针变量,然后输出他指向的单元即int *p,printf("%d",*p),可以看出刚开始指针的指向是不确定的。
2 指针变量做函数参数
我倒觉得这是c语⾔中精髓的东西,单向传址
(1)单向 c语⾔中实参和形参变量之间的数据传递是单项的“值传递”⽅式指针变量同样要遵循这⼀原则所以说调⽤函数不能改变实参指针变量的值,但可以改变实参指针变量所指变量的值
(2)传址就是实参和形参共⽤⼀个空间,所以函数会改变实参的值了就这么简单c语言指针实验总结
它的优点就是节约了存储空间提⾼了程序的效率
3 指针和数组
(1) 在处理数组的时候编译系统是这样处理的将数组a[i]转换为*(a+i)就是要根据数组的⾸地址先计算数组元素的地址,然后再来查数据,可以看出这样的费时较多,直接使⽤指针变量的⽅法较快,他的⾃增⾃减较快,这⾥要注意的是数组名即数组的指针并不能⾃增⾃减它是固定不变的。
(2)关于指针和多维数组的问题
我觉得这个地⽅很繁琐,不太容易掌握⽤⼀个例⼦说明问题
⼀个3*2数组a,把它看成是3个⼀维数组则根据⼀维数组的指针定义,数组名即为数组的指针,通常有a[i]代表a[i][0]的地址所以 a+i=a[i]=&a[i][0].另外⼜有a[i]=*(a+i),所以a+i和*(a+i)有相同的值
访问某⼀个元素的时候a[i][j]等价*(a[i]+j),⼜由于上⾯的a[i]=*(a+i),所以a[i][j]=*(*(a+i)+j)
4指针和字符串
(1)⾸先弄清楚输⼊函数和输出函数中的 %s这个输出形式的意义,定义⼀个字符串char a[]="i love china.";
他的输⼊语句和输⼊语句是
scanf("%s",a);
printf("%s",a);
⽤这个输出形式的时候输出的变量类型是个指针变量,即字符串的⾸地址。另外再输出字符串的时候是以‘/0’为结束符的。
(2)字符指针变量和字符数组
.
初始化:
char *pa="hello";
这⾥并没有对hello这个字符数组初始化,⽽是都对指针变量的初始化
.指针变量的指向问题:
刚开始声明⼀个指针变量他的指向是不确定的,所以如果他的指向使系统中有⽤的单元,那么在赋值操作中有可能破坏程序,所以刚开始在声明之后⼀定要使它指向确定的值。
如 char *pa;
scanf("%s",pa); 这种⽅法是很危险的,因为pa初始指向并不确定,后⾯的输⼊语句会覆盖掉pa的初始指向
正确的⽅法是 char *pa,s[];
pa=s;
scanf("%s",pa);
.指向字符串的指针变量是可变的,可是字符数组名是不可变的。
如 char *pa="hello";
pa++是正确的
char str[]="hello";
str++;是错误的
5 函数和指针
(1)指向函数的指针变量
在函数嵌套中⼗分有⽤,⽐如说⼀个双⽬运算,我们要求输出结果
则有这样的⼀个函数
result(int a,int b,int (*pf)())
这⾥⾯的最后⼀个变量就可以是加减乘除,这样写增加了函数的通⽤性和灵活性,所以可以编⼀个通⽤的函数来实现各种专业的功能。
(2)指针函数
这⾥实在没有什么经验,因为到现在我的程序⾥好像没⽤过指针函数。
(3)指针数组和指向指针的指针
指针数组有利于节约空间,⽐如说⼀个含三个字符串的数组,如果⽤数组来申请空间,那么每⼀个字符串申请的空间⼤⼩必须和最长的那个字符串⼀样,⽽引⼊指针数组的⽬的是便于统⼀管理同类的指针,⽽由于指针是动态申请空间的,所以节约空间
这就是我重看指针的感触,希望⼤家多提宝贵意见,互相讨论⼀下共同进步
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论