1040502110 发表于 2014-10-8 22:24:15

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

本帖最后由 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;//为什么这个指针数组中的元素没有初始化就可以直接写入?如果指针指到系统区后果会是什么?
s = "你";
s = "好!";
printf("%s%s\n",s,s);

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

a = x;   //   虽然这里的x等价于&x,写成x就变成地址值了。但是为什么不用初始化就可以直接给指针赋值。
printf("%d\n",*a);
return 0;
}

仰望天上的光 发表于 2014-10-9 08:13:39

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

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

还有,

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

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










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

总结一下指针记住几点
1. 理清楚指针本身 和 指针指向的内存之间的关系
2. 指针的类型和指针指向的类型
3. 字符串和数组 与指针的联系
int main(int argc, char* argv[])
{
        printf("%c\n","hello world");
        return 0;
}
你可以试下这个小程序 可以加深字符串和数组的理解

大个的糖果 发表于 2014-11-1 06:57:13

页: [1]
查看完整版本: 指针使用必须要初始化赋值?求大神详解。