c语言关于指针方面的问题

大家帮个忙哇,我又看晕了,请高手指点下吧
请看:char *a;
scanf("%s",a);
书上是这样解释的:目的是输入一个字符串,虽然一般也能运行,但这种方法是有危险的,因为a的值并未指定,a单元是一个不可预料的值,它可能指向以存放数据的有用内存段。
那么,我的疑问是:譬如int *p,max=3;
p=&max;
毫无疑问这是正确的,但要照书上所说那样,定义指针变量p,此时p的值不可预料,若是p指向有用的内存段,那把max的地址放入,岂不也是危险呀!?
不知道大家能不能看得懂我的意思,感觉表达不是很明确,麻烦各位了

你对指针还没有理解,没有弄清楚修改指针的值和修改指针指向单元的值的概念。

指针是这样一种数据类型,它的值是某一块内存的地址。
指针变量和其他变量一样,它的值都是可以修改的。

修改指针的值,不会修改指针指向的内存中的数据。
int *p,a,b,c;
p=&a;
p=&b;
p=&c;

尽管指针 p 的值被修改了三次,但是 a,b,c 都不会变化。

但是通过指针修改指针指向的内存单元的值时,就要明确当前指针指向的内存单元是否时可预料的。如:
int *p;
*p=1;

是非法的,p指向的内存单元未知。

int *p,a;;
p=&a;
p=1;

是合法的,p指向了可预知的内存单元(既变量a的内存中的地址)
温馨提示:内容为网友见解,仅供参考
第1个回答  2010-03-19
这两个语句有本质的不同
scanf("%s",a)
是对指针a所指向的内存空间赋值
p=&max
是更改p所指向的内存空间(将不可预知的内存空间地址,改为max的内存空间地址,正好避免了问题)
简单的说就是*p=……和p=……的关系
第2个回答  2010-03-19
打个比方,内存中存放变量的一段空间是一间房子,而指针可以理解为
打开房子的钥匙(当然钥匙可能不止一把),现在呢,int max=3;
可以理解你在一间房间号是max的房里放了3,而p=&max;可以理解为你拿到了
max这个房间的钥匙。当然这个钥匙打不开房间号是min,others...的房间。

好了,现在看看char *a; scanf("%s",a); 假如你从一堆钥匙中随便拿了一把,
你也不知道这把钥匙能开哪个房间,现在你想做的是,无论这个钥匙打开了哪个
房间,你都要把你的东西放进去,你觉得安全吗?
第3个回答  2010-03-19
我的枪本来指着路人甲,现在又指着你,这有什么危险的(浪费子弹的危险)
第4个回答  2010-03-19
首先需要肯定的是用指针操作就会带来风险!
分析:1 char *a;
此时申明了一个指针,但未被初始化,也就等同于生成了一个野指针。
其内容可以是0x0、0x10、0xff等等。
假设指针变量已有值0x1ff,即该指针指向地址为0x1ff的8bit内存单元。我们假设内存寻址范围为0x0--0x100。当你输入字符串后,就造成了内存的溢出,那后果。。。。。。。再比方说你已经定义了以个变量 char b;变量b的地址为0x1ff,并已赋值,那当你再次调用scanf("%s",a);变量b的内容就被覆盖。
2 int *p,max=3;
p=&max;

声明一个指针变量p(指向整型) 与整型变量max
并对p赋值,此时等同于对p进行了初始化(p的值等于max的地址,这个地址是一个有效地址)。这样修改p的内容就等同于修改max,如果要说危险是正确的(因为修改p的内容就等同于修改max),但不会出现1中的情况.

c语言指针的赋值问题
在C语言中,指针是一个变量,其特殊之处在于它存储的是其他变量的地址,而不是值本身。指针使我们能够间接地访问和修改变量的值。指针的赋值过程 当我们为指针变量赋值时,实际上是将其指向一个变量的内存地址赋给它。这个过程分为两步:首先确定变量的地址,然后将这个地址赋给指针变量。例如,如果我们...

C语言指针问题
一、如有定义char y[4]= "321"则表达式 *y+2的值是'5' 。分析:y是字符串数组首元素'3'的地址,*y的值就是字符'3',再加上2,就是字符'5'(也可以说是字符'5'的ASC码值)。二、 如有定义char z[2][4]={"MAT", "LAB"};,则表达式*(*z+2)的值是 'T'。分析:z是二维字符...

C语言指针问题
1、ptr赋值为arr地址后指向第一个元素,即元素6.2、*(ptr++) += 123;由于是右侧操作(递增后缀),所以先取ptr地址后再递增ptr,此时取得的地址还是第一个元素地址(递增后ptr指向第二个元素,也就是7,这是第一次递增),因此是对6+123=129,并保存原地址,即第一个元素地址,因此6被改为129...

C语言 链表 指针问题
1、删除指针,并不会释放他指向的内存地址。2、如果你指向的地址还需要用,为什么要删除其指针。同一个地址可以有多个指针。你可以在结构里定义2个链表指针,分别是正向和反向,这样你输入的的时候,就直接得到正反两个链表了。我写了案例,你参考吧。include <stdio.h>#include <malloc.h>#define si...

c语言问题,关于指针的问题
一、比如我们定义一个int型指针变量。int *p=NULL;初值为空。那么当执行while(p);时,只有p==NULL时,while循环才会结束。所以如果我们写while(p);printf。。。;那么只有当p为空时,后面的printf才会执行。否则就一直循环,这样我们就能判断p为空了。同理!p,自然就能判断p不为空了。二、p...

c语言程序指针问题
1、指针赋值带来的内存丢失在C语言中指针之间是可以相互赋值的,但是使用不当可能会造成部分内存的“丢失” ,即这部分内存空间不能再被该任何程序访问。如: main(){float *a, *b;a=(float)malloc( sizeof( float));b=(float)malloc( ...

C语言中的指针问题到底是怎么回事~
指针的类型(即指针本身的类型)和指针所指向的类型是两个概念。当你对C越来越熟悉时,你会发现,把与指针搅和在一起的“类型”这个概念分成“指针的类型”和“指针所指向的类型”两个概念,是精通指针的关键点之一。我看了不少书,发现有些写得差的书中,就把指针的这两个概念搅在一起了,所以看起书来前后矛盾,...

c语言,指针指向另一个指针的问题,为什么报错?
图中红色框内代码有误,*(p+5)不是表示指针而是值。应改为 q = p+5 另外补充说明,改成这样虽然没有语法错误,但是很明显p+5已经超过数组a的内存空间,需要注意。

有关于计算机C语言的Pointer问题
在探讨计算机C语言的Pointer问题时,我们需要首先理解Pointer的基本概念。Pointer是一种存储变量地址的变量,它在C语言中扮演着至关重要的角色。让我们逐一解析这六种情况,以更直观的方式理解Pointer。1. 定义一个整型变量k,并将k的地址赋给指针t。这表示我们创建了一个指向整型变量的Pointer,可以用来...

C语言指针问题?
调用结束后,所有实际参数的值均不会发生变化。但是swap3中*pa,*pb发生的交换(实际就是主函数中a和b的值发生了交换)

相似回答
大家正在搜