指针的使用注意事项(个人体…
2013-12-19 20:30
225 查看
原文地址:指针的使用注意事项(个人体会)作者:残翅天使的眼泪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
初始化又分为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
相关文章推荐
- 指针的使用注意事项(个人体…
- C开发注意事项_字符串及指针使用
- Keil C51 中的函数指针使用注意事项
- C++智能指针使用注意事项
- 智能指针使用注意事项
- 结构体指针变量使用时的注意事项
- 使用指针作为函数参数的注意事项
- C++中指针初始化和使用注意事项
- c++ shared_ptr智能指针使用注意事项
- 浅谈指针使用中注意事项
- 数组与指针--多维数组与多重指针使用注意事项
- 使用智能指针的注意事项
- C++ 二叉树的实现以及指针使用注意事项
- C++ 构造函数使用 ":成员变量(形参)" 的形式给类里面成员变量赋值,如果成员变量和形参是指针,那么需要注意的事项
- TODO:Golang指针使用注意事项
- 指针使用中的注意事项
- 笔记3:指针和使用时一些注意事项
- 指针使用注意事项
- 浅谈指针使用中注意事项
- 指针使用时注意事项