指针的使用注意事项(个人体…

1.指针一定要有指向(赋值),就是一定要“初始化”。否则容易产生莫名的错误。

初始化又分为3种。

第一种,指向实心砖头(NULL)。即:p=NULL。此时指针的地址值为0.指针指向一个实心的转头,指针只有指向,指向的转头里面不能放任何数据。

第二种,指向满仓库(仓库里放了东西,所以称为“满”)。这个仓库里面可能放的是变量,指针,函数,数组等。这类变量,指针,函数,数组都是已经赋值了(定义过了,或者叫初始化过了)。

例如:int a,*p;             int a[3],*p;

          a=3;                  a[3]={2,4,1};

          p=&a;                 p=a;

第三类,指向空仓库(仓库里没有放东西,所以称为“空”)。这个仓库里面可能放的是变量,指针,函数,数组等。但是这类变量,指针(指针最好要初始化,说成一定要初始化也不为过),函数,数组都是没有赋值了(定义过了,或者叫初始化过了)。

例如:int a,*p;             int a[3],*p;

          p=&a;                 p=a;

仓库名:地址值

仓库内容:地址存放的内容(指针指向的内容)

指针就是存放地址值的变量,指针可以指向空值(NULL),可以指向未赋值的变量(空仓库),但是不能不给指向。

2.如果要使用一个作为中间变量的指针,指针不要乱赋值,最好给这个作为中间变量的指针指向一个新的变量,以避免和需要操作的变量发生关联,而影响程序的正确性。

 

例如:要实现a和b互换,需要互换。

用变量实现:int a,b,t;

                t=a;a=b;b=t;

用指针实现:int a,b,c,*t,*p,*q;

                p=&a,q=&b,t=&c;  // 指针t指向了一个新的变量c,而不是简单的指给了a或者b

                *t=*a;*a=*b;*b=*t;(如果这一句改写为t=a,a=b,b=t,a和b没互换,只是换了指针p和q的指向)

 

实例分析:输入三个字符串,按由小到大的顺序输出:

错误程序:

#include<stdio.h>      
#include<string.h>
#define M 40
main()
{
 char a1[3][M];      //char a1[3][M],b1[3][M];
 char (*p)[M];
 char (*temp)[M];                                                                  
 p=a1;
 temp=a1;   //把中间变量指针temp赋予后面需要操作的a1,结果导致出错,因为中间变temp指向a1对后面对a1的操作影响了           //temp=b1;
 int i,j;
 printf("put into your text:n");
 for(i=0;i<3;i++)
 {
  scanf("%s",p++);
 }
 for(i=0,p=a1;i<3;i++)
 {
  printf("%s ",p++);  
 }
 printf("n");
 for(j=0,p=a1;j<2;j++)//冒泡法
 {
  for(i=0;i<2-j;i++)
  if(strlen(*(p+i))>strlen(*(p+i+1))) //实现字符数组与字符数组的互换
  {
   strcpy(*temp,*(p+i));         //字符串赋值要用strcpy实现
   strcpy(*(p+i),*(p+i+1));
   strcpy(*(p+i+1),*temp);  
  }
 }
 for(i=0,p=a1;i<3;i++)
 {
  printf("%s ",p++);
  
 }
    printf("n");

输入how is y               

输出y y is(明显是错误的)   //输出y is how

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值