作者在 2011-09-02 16:33:19 发布以下内容
常见错误1
# include <stdio.h>
int main (void)
{
int * p;
int i = 3;
*p = i; //这样写是错的,前面定义了两个变量,p和i。这条语句把i赋值给了以p变量里内容为地址的另一个变量
//p变量里的内容没定义,是个垃圾值,那么以这个垃圾值为地址的变量是什么并不确定
//这时候的赋值,指不定会把那里给篡改了,尽管编译时可能不报错或者不警告,但执行起来可能会出问题
printf("%d\n",*p);
return 0;
}
int main (void)
{
int * p;
int i = 3;
*p = i; //这样写是错的,前面定义了两个变量,p和i。这条语句把i赋值给了以p变量里内容为地址的另一个变量
//p变量里的内容没定义,是个垃圾值,那么以这个垃圾值为地址的变量是什么并不确定
//这时候的赋值,指不定会把那里给篡改了,尽管编译时可能不报错或者不警告,但执行起来可能会出问题
printf("%d\n",*p);
return 0;
}
常见错误2
# include <stdio.h>
int main (void)
{
int i = 3;
int * p;
int * q;
p = &i;
//*q = p; //这么写是错误的,*p是int型,q是int *型的,语法有错误:error C2440: '=' : cannot convert from 'int *' to 'int'
//*q = *p; //这么写也是错误的,原因类似于常见问题1里讲的。这里q变量没定义初值,里面存的是垃圾值,*q表示以这个垃圾值为地址的某个变量
//往这个变量中赋值,会引起系统潜在的风险,所以执行时会被系统强行关闭
//p = q; //这么写,本条语句语法上没错误,但因为q没赋初值,所以里面存的是个垃圾值,那么*q是指不定在那的一个空间的变量
//但下一语句,需要读出这个不确定的变量的值,这对系统安全是危险的,不被允许
/*也就是说,q的空间属于本程序,所以本程序可以读写q的内容
但这时候q内部是垃圾值,则本程序不能读写*q的内容
因为此时*q所代表的内存单元的控制权并没有分配给本程序,既不能写,也不能读
运行时,系统会强行关闭
*/
q = p; //这样写,才OK,此时把p变量的内容赋值给了q, 已经知道p变量中的内容是i的地址
//那么q变量里的内容也就变成了i变量的地址
//*q是以q变量里内容为地址的变量,也就是以i的地址为地址的变量,也就是i,所以最后输出的*q的值是3
printf("%d\n",*q);
return 0;
}
int main (void)
{
int i = 3;
int * p;
int * q;
p = &i;
//*q = p; //这么写是错误的,*p是int型,q是int *型的,语法有错误:error C2440: '=' : cannot convert from 'int *' to 'int'
//*q = *p; //这么写也是错误的,原因类似于常见问题1里讲的。这里q变量没定义初值,里面存的是垃圾值,*q表示以这个垃圾值为地址的某个变量
//往这个变量中赋值,会引起系统潜在的风险,所以执行时会被系统强行关闭
//p = q; //这么写,本条语句语法上没错误,但因为q没赋初值,所以里面存的是个垃圾值,那么*q是指不定在那的一个空间的变量
//但下一语句,需要读出这个不确定的变量的值,这对系统安全是危险的,不被允许
/*也就是说,q的空间属于本程序,所以本程序可以读写q的内容
但这时候q内部是垃圾值,则本程序不能读写*q的内容
因为此时*q所代表的内存单元的控制权并没有分配给本程序,既不能写,也不能读
运行时,系统会强行关闭
*/
q = p; //这样写,才OK,此时把p变量的内容赋值给了q, 已经知道p变量中的内容是i的地址
//那么q变量里的内容也就变成了i变量的地址
//*q是以q变量里内容为地址的变量,也就是以i的地址为地址的变量,也就是i,所以最后输出的*q的值是3
printf("%d\n",*q);
return 0;
}