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)传址  就是实参和形参共用一个空间,所以函数会改变实参的值了 就这么简单
 它的优点就是节约了存储空间 提高了程序的效率
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)指针数组和指向指针的指针
指针数组有利于节约空间,比如说一个含三个字符串的数组,如果用数组来申请空间,那么每一个字符串申请的空间大小必须和最长的那个字符串一样,而引入指针数组的目的是便于统一管理同类的指针,而由于指针是动态申请空间的,所以节约空间
这就是我重看指针的感触,希望大家多提宝贵意见,互相讨论一下共同进步
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值