| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1083 人关注过本帖
标题:奇怪的指针问题,欢迎进来讨论
只看楼主 加入收藏
spitcold
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2007-7-20
收藏
 问题点数:0 回复次数:18 
奇怪的指针问题,欢迎进来讨论
我碰到如下一些疑惑,先谢谢各位的发言!

/*****************第1个问题 :***************/

#include <stdio.h>
void main()
{
char str[3][10]={"china","canada","English"}; //第1行
char **pt;//第 2 行
pt=str;//第 3 行
printf("%s",pt);//第 4 行
}
运行结果:china

(1)如果将第2行改为 char *pt.运行结果居然不变?
疑问: 个人认为str[3][10]说明str是指针的指针啊?怎么可以用char *pt ?
(2)如果将第4行改为printf("%s",*pt),结果居然是内存不能为read

/*********************第2个问题:****************/

char *data[10]={"one","two","three","four"};
char data[10][10]={"one","two","three","four"};
请问这两行有什么区别?

/*********************第3个问题:****************/

#include <stdio.h>
#include <stdlib.h>

void main()
{
char *p,a[]="china";
p=a;
while(*p!=NULL) //一开始少了*号,引起不必要讨论,非常惭愧.
{
*p=*p+4;
p++;
}
printf("%s",a);
}

运行结果正常,但是如果将a[]="china"该为*p="china"就引起内存只读错误,即使用先用malloc开辟内存给p指针
(一开始我错误的把while(*p!=NULL)少了*号,引起朋友们在这一点上的讨论,非常抱歉,今后一定更加详细的检查以免浪费网友宝贵时间!


/********************** 部分结贴************************/
第三问:8楼正解!


[此贴子已经被作者于2007-7-24 19:15:42编辑过]

搜索更多相关主题的帖子: 指针 欢迎 
2007-07-23 21:07
anlogo
Rank: 2
等 级:论坛游民
威 望:1
帖 子:293
专家分:20
注 册:2007-7-20
收藏
得分:0 
第一问:
先看看下面这个程序,你就明白
#include <stdio.h>
void main()
{
char str[3][10]={"china","canada","English"};
char *pt,**ppt;
pt=str;
ppt=pt; /*这两行就相当于ppt=pt=str*/
printf("%s",ppt);
getch();
}
疑问一可以知道答案了吧,而疑问二,*pt是一个地址,当然不能用%s输出.

第二问:
char *data[10] 是指针数组,不能这样赋值
而char (*data)[10] 则可以相当于 data[10][10],一维数却未知

第三问:
觉得循环条件有问题:p!='\0';
你说出现的问题就不清楚了.

以上纯属个人见解,仍望高手指点.
2007-07-23 22:39
anlogo
Rank: 2
等 级:论坛游民
威 望:1
帖 子:293
专家分:20
注 册:2007-7-20
收藏
得分:0 

晕了
我知道第三问错在那了
是循环条件的问题:
*p!='\0'
真晕~~~~~~~~~~

2007-07-23 22:49
anlogo
Rank: 2
等 级:论坛游民
威 望:1
帖 子:293
专家分:20
注 册:2007-7-20
收藏
得分:0 
学到东西了
原来'\0'==NULL
2007-07-23 22:51
ZSXCT
Rank: 1
等 级:新手上路
帖 子:28
专家分:0
注 册:2007-7-10
收藏
得分:0 
我也是新手,希望和大家能共同交流,共同提高。
1、(1)**pt是指向指针的指针(间接指向),*pt也是指针,pt同为地址。所以输出一样。
(2)%s是要求输入首地址,而无论*pt还是**pt不代表地址,所以显示错误。
2、*data[],data是指针数组,定义字符串时不用指定列数。*data代表字符串数组第一个地址。
data[][]是字符串数组,必须定义长度。
2007-07-23 23:05
melodylsp
Rank: 1
等 级:新手上路
帖 子:35
专家分:0
注 册:2007-7-22
收藏
得分:0 

第二个问题我是这样理解
char *data[10]={"one","two","three","four"};
是用指针数组表示字符串
data[0],data[1],data[2],data[3]分别赋值为"one","two","three","four"
data[0]-data[9]都是字符指针
存储长度分别为4,4,6,5字节
data[4]-data[9]赋值NULL

char data[10][10]={"one","two","three","four"};
是直接表示的字符串数组
data[0],data[1],data[2],data[3]分别赋值为"one","two","three","four"
data[0]-data[9]是首地址常量
存储长度全部为10字节
其余部分不赋值

[此贴子已经被作者于2007-7-24 15:05:58编辑过]


2007-07-23 23:08
anlogo
Rank: 2
等 级:论坛游民
威 望:1
帖 子:293
专家分:20
注 册:2007-7-20
收藏
得分:0 
char *data[10]={"one","two","three","four"};
明白了这样赋值也是可以的
2007-07-23 23:17
boot2046
Rank: 2
等 级:新手上路
威 望:3
帖 子:168
专家分:0
注 册:2007-7-23
收藏
得分:0 
a[]="china"
*p="china"

第一种是在栈上分配的,所以对他进行修改是没有问题的
第二种是在只读存储区分配的,去修改一块只读的内存就会引起段错误

Linux是简单的,你不需要成为天才也能理解这种简单,Windows是复杂的,就算你是天才也不能理解这种复杂
2007-07-24 09:22
福尔摩斯
Rank: 5Rank: 5
等 级:贵宾
威 望:12
帖 子:4011
专家分:370
注 册:2006-8-15
收藏
得分:0 

/*****************第1个问题 :***************/

#include <stdio.h>
void main()
{
char str[3][10]={"china","canada","English"}; //第1行
char **pt;//第 2 行
pt=str;//第 3 行
printf("%s",pt);//第 4 行
}
运行结果:china

(1)如果将第2行改为 char *pt.运行结果居然不变?
疑问: 个人认为str[3][10]说明str是指针的指针啊?怎么可以用char *pt ?

你不知道系统读取字符串是只读到‘\0’吗?


(2)如果将第4行改为printf("%s",*pt),结果居然是内存不能为read

又是一个没看书的……

/*********************第2个问题:****************/

char *data[10]={"one","two","three","four"};
char data[10][10]={"one","two","three","four"};
请问这两行有什么区别?


数组的本质是指针

/*********************第3个问题:****************/

#include <stdio.h>
#include <stdlib.h>

void main()
{
char *p,a[]="china";
p=a;
while(p!=NULL)
{
*p=*p+4;
p++;
}
printf("%s",a);
}

运行结果正常,但是如果将a[]="china"该为*p="china"就引起内存只读错误,即使用先用malloc开辟内存给p指针

字符指针的赋值重新看过!


自我放逐。。。
2007-07-24 09:37
卷入内核
Rank: 1
等 级:新手上路
帖 子:30
专家分:0
注 册:2007-7-2
收藏
得分:0 

小弟也是学了没多久的C语言,如果大家有兴趣的话加这个群一起探讨下吧+43335834

2007-07-24 12:46
快速回复:奇怪的指针问题,欢迎进来讨论
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.049352 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved