当前位置: 代码迷 >> C语言 >> 奇怪的指针问题,欢迎进来讨论
  详细解决方案

奇怪的指针问题,欢迎进来讨论

热度:128   发布时间:2007-07-23 21:07:48.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 ?
(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编辑过]

搜索更多相关的解决方案: 指针  欢迎  

----------------解决方案--------------------------------------------------------
第一问:
先看看下面这个程序,你就明白
#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';
你说出现的问题就不清楚了.

以上纯属个人见解,仍望高手指点.
----------------解决方案--------------------------------------------------------

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


----------------解决方案--------------------------------------------------------
学到东西了
原来'\0'==NULL
----------------解决方案--------------------------------------------------------
我也是新手,希望和大家能共同交流,共同提高。
1、(1)**pt是指向指针的指针(间接指向),*pt也是指针,pt同为地址。所以输出一样。
(2)%s是要求输入首地址,而无论*pt还是**pt不代表地址,所以显示错误。
2、*data[],data是指针数组,定义字符串时不用指定列数。*data代表字符串数组第一个地址。
data[][]是字符串数组,必须定义长度。
----------------解决方案--------------------------------------------------------

第二个问题我是这样理解
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编辑过]


----------------解决方案--------------------------------------------------------
char *data[10]={"one","two","three","four"};
明白了这样赋值也是可以的
----------------解决方案--------------------------------------------------------
a[]="china"
*p="china"

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

----------------解决方案--------------------------------------------------------

/*****************第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指针

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


----------------解决方案--------------------------------------------------------

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


----------------解决方案--------------------------------------------------------
  相关解决方案