鱼C论坛

 找回密码
 立即注册
查看: 1681|回复: 3

指针使用必须要初始化赋值?求大神详解。

[复制链接]
发表于 2014-10-8 22:24:15 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 1040502110 于 2014-10-8 22:27 编辑

书上写的是指针使用必须要初始化,也就是对指针进行赋值操作的时候,由于指针是乱指的,如果不初始化直接写入,那么编译后的程序无法正常运行,例如
#include <stdio.h>
int main(void)
{
int *a;
*a = 10;
printf("%d\n",*a);
return 0;
}

这个很明显是错误的。
如果改成以下
#include <stdio.h>
int main(void)
{
int *a, b;
a = &b;
*a = 10;
printf("%d\n",*a);
return 0;
}
这样就正确了,因为初始化了。

但是以下的几个问题我实在是想不透,希望高手详解以下。
#include <stdio.h>
int main(void)
{
char *s[2];  //为什么这个指针数组中的元素没有初始化就可以直接写入?如果指针指到系统区后果会是什么?
s[0] = "你";
s[1] = "好!";
  printf("%s%s\n",s[0],s[1]);  

return 0;
}
还有下面的
int main(void)
{
int *a;
int x[2] = {10,20};

a = x;   //   虽然这里的x等价于&x[0],写成x就变成地址值了。但是为什么不用初始化就可以直接给指针赋值。
printf("%d\n",*a);
return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-10-9 08:13:39 | 显示全部楼层
首先,根据你的第一个例子,我觉得你所谓的“写入指针”意思是:
如:
int *a;
*a = 10;
也就是  *指针变量=XXX;
然而,你后面举的例子中并没有出现上述结构。
如:
#include <stdio.h>
int main(void)
{
char *s[2];  //为什么这个指针数组中的元素没有初始化就可以直接写入?如果指针指到系统区后果会是什么?
s[0] = "你";
s[1] = "好!";
   printf("%s%s\n",s[0],s[1]);  

return 0;
}
这里,s[0]是一个指针变量,人家写的的是s[0]=XXX, 而不是*(s[0])=XXX

还有,

int main(void)
{
int *a;
int x[2] = {10,20};

a = x;   //   虽然这里的x等价于&x[0],写成x就变成地址值了。但是为什么不用初始化就可以直接给指针赋值。
printf("%d\n",*a);
return 0;
}
int *a;后,它写的是a=XXX,而不是*a=XXX
所以你举的例子完全和你最前面提的东西是两个概念。










想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-10-9 09:35:44 | 显示全部楼层
指针并不是一定要初始化的 ,只是如果你要操作它所指向的内存时,你一定要保证它指向的内容有意义 。
指针本身 和 指针指向的内存时两回事。
#include <stdio.h>
int main(void)
{
int *a;
*a = 10;
printf("%d\n",*a);
return 0;
}
#include <stdio.h>
int main(void)
{
int *a, b;
a = &b;
*a = 10;
printf("%d\n",*a);
return 0;
}
这两处 因为要向a所指的内存写入值 所以一定要指向合法的内存 也就是你所说的初始化赋值了即将a指向一段合法的内存,否则a指向的内存将指向一段无意义的内存 a就变成了著名的“野指针”、

#include <stdio.h>
int main(void)
{
char *s[2];  
s[0] = "你";
s[1] = "好!";
printf("%s%s\n",s[0],s[1]);  
return 0;
}
这里因为是char*数组 每个元素就是char* ,"你"“好”是两个常量字符串 当作为右值时就是地址
int main(void)
{
int *a;
int x[2] = {10,20};
a = x;  
printf("%d\n",*a);
return 0;
}
首先 x 是不等价&x[0]的 他们只是值上相等而已意义是不同的 要切记类型的概念在C中是很特殊的
x是指向2*sizeof(int)个字节的内存 而&x[0]是指向sizeof(int)个字节大小的内存
然后所谓的初始化就是在定义变量之后赋值 这里a = x就是对a进行初始化
而x是一个常量在数值上就等于数组首元素的地址 是不能对x进行赋值的
但是可以对x指向的内容进行赋值 即对数组的元素赋值

总结一下指针记住几点
1. 理清楚指针本身 和 指针指向的内存之间的关系
2. 指针的类型和指针指向的类型
3. 字符串和数组 与指针的联系
int main(int argc, char* argv[])
{
        printf("%c\n","hello world"[3]);
        return 0;
}
你可以试下这个小程序 可以加深字符串和数组的理解
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

头像被屏蔽
发表于 2014-11-1 06:57:13 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-25 05:54

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表