| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 958 人关注过本帖
标题:[讨论]再请教一个指针问题
只看楼主 加入收藏
herotobe
Rank: 1
等 级:新手上路
威 望:1
帖 子:48
专家分:0
注 册:2006-5-3
收藏
得分:0 

#include <string.h>
#include <conio.h>
#define NUM 7
void countrysort(char **p);
main()
{char * country[NUM]={"China","America","France","England","SouthKrean","Canada","Borland"};
int i;

countrysort(country);

for(i=0;i<NUM;i++)
printf("%s\n",country[i]);

getch(); /* 请不要删除此行 */
}

void countrysort(char * *p)
{char *maxstring;
int i,j,k;

for(i=0;i<NUM-1;i++)
{ k=i;
maxstring=*(p+i);

for(j=i+1;j<NUM;j++)
if(strcmp(*(p+j),maxstring)>0)
{ maxstring=*(p+j);k=j ;}
if(k!=i)
{ *(p+k)=*(p+i);
*(p+i)=maxstring;
}

}

}



After all,tomorrow is another day!!!!
2006-05-05 13:20
hqx
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2006-5-5
收藏
得分:0 
楼主的:
char *list[]={"boy",
"girl",
"hacker",
"cracker","honker","xbox","blogger","vfp","qiaomu","pragrammer"};
三楼的:
另外,字符数组直接这样定义: char str_Array[]={"","","",...};

首先,三楼的不用多说,语法都是错误的。正确应该是char str_Array[][] = {""....};
其次,楼主的定义语法上并没错误,但是很危险。楼主你知道这句执行后,"boy","girl"...这些字符串存放在哪个区间么?这些字符串存放在静态存储区,而且是常量字符串!请注意“常量字符串”!你无法往里面写入内容,当然,如果用VC编译,在Release编译模式下可以强制写入,但是会造成其他隐患(什么隐患?这个讲起来就多了,略过).
因此,定义或输入字符串时,请千万注意:我的字符串到底存放在哪里?
char s1[] = "hello";
void main()
{
char s2[] = "hello";
static char s3[] = "hello";
char *p1 = "hello";
char *p2 = (char *) malloc (10);
strcpy(p2, "hello");

....
free(p2);
p2 = NULL;
}
s1, 全局变量,静态存储区,整个程序内有效
s2 局部变量,栈,函数局部有效
s3 函数内部静态变量,只在第一次定义时分配内存初始化,整个程序内有效
p1 指向一个常量字符串,绝对不允许出现这种定义!谭浩强的书上有这种定义,这家伙
懂一点语法就到处出书,误人子弟!他的C程序设计很多错误。
p2 函数局部变量,堆,整个程序有效
多文件工程static 还有其他用途:将某个变量限制在一个编译单元内。
2006-05-05 14:23
–★–
Rank: 3Rank: 3
等 级:新手上路
威 望:6
帖 子:1512
专家分:0
注 册:2006-5-1
收藏
得分:0 

你无法往里面写入内容,当然,如果用VC编译,在Release编译模式下可以强制写入,但是会造成其他隐患(什么隐患?这个讲起来就多了,略过).因此,定义或输入字符串时,请千万注意:我的字符串到底存放在哪里?

如雷贯耳。批评老谭的话重了。事实上,谭书是C89时代的产物,拿C99去要求它,自然“没得命”啦。例如每道程序题,他老人家都是
void main(){......}
据说就跟新标准“犯冲”。所以如今吓得我等白白多写一行return 0;并把首行写成int main( )甚至圆括弧中还得写点“劳什子”才标准!



落霞与孤鹜齐飞,秋水共长天一色! 心有多大,路有多宽。三教九流,鸡鸣狗盗。兼收并蓄,海纳百川。
2006-05-05 14:43
–★–
Rank: 3Rank: 3
等 级:新手上路
威 望:6
帖 子:1512
专家分:0
注 册:2006-5-1
收藏
得分:0 

/*
请教hqx,为何11楼的排序非常成功呢?
*/
#include<stdio.h>
#include<string.h>

#define NUM 7

void countrysort(char **p);

main()
{
char*country[NUM]={"China","America","France","England",
"SouthKrean","Canada","Borland"};
int i;

countrysort(country);

for(i=0;i<NUM;i++)
printf("%s\n",country[i]);
}

void countrysort(char **p)
{ char *maxstring;
int i,j,k;
for(i=0;i<NUM-1;i++)
{ k=i;
maxstring=*(p+i);
for(j=i+1;j<NUM;j++)
if(strcmp(*(p+j),maxstring)<0)
{ maxstring=*(p+j);k=j; }
if(k!=i)
{ *(p+k)=*(p+i);
*(p+i)=maxstring;
}
}
}


落霞与孤鹜齐飞,秋水共长天一色! 心有多大,路有多宽。三教九流,鸡鸣狗盗。兼收并蓄,海纳百川。
2006-05-05 14:53
herotobe
Rank: 1
等 级:新手上路
威 望:1
帖 子:48
专家分:0
注 册:2006-5-3
收藏
得分:0 
12楼hqx说,绝对不允许出现这样的定义:char * p="helloworld";
我在定义字符串时经常用这样的方法来定义,而且也没有出错。
在一些书上说,
赋值语句:char *point="i am a student "; 将字符串常量"I am a student"的值,就是该字符串在内在中的首地址赋给point。
我觉得这很有道理,但hqx说绝对不允许出现这样的定义。我实在是不明白,
请各位赐教

After all,tomorrow is another day!!!!
2006-05-05 15:43
–★–
Rank: 3Rank: 3
等 级:新手上路
威 望:6
帖 子:1512
专家分:0
注 册:2006-5-1
收藏
得分:0 
回复:(herotobe)12楼hqx说,绝对不允许出现这样的定...
完全同意你的看法。而且我还观察到不同编译器之间的微妙区别。
在Turbo C 2.0,不仅允许这样,而且还允许通过那个指针,悄悄地
修改那个串,当然,作为程序员为防止崩溃,不可以扩张这个串。
而在VC++ 6.0下,就只允许通过指针“读”子串而不能修改。刚刚
hqx的发言对我的帮助是“release”下可以进行“写”,以前未曾
注意到这个细节。所以我雀跃了一下,“朝闻道,夕死可矣”。

落霞与孤鹜齐飞,秋水共长天一色! 心有多大,路有多宽。三教九流,鸡鸣狗盗。兼收并蓄,海纳百川。
2006-05-05 16:38
lyhorg
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2006-4-22
收藏
得分:0 
[QUOTE]12楼hqx说,绝对不允许出现这样的定义:char * p="helloworld";
我在定义字符串时经常用这样的方法来定义,而且也没有出错。
在一些书上说,
赋值语句:char *point="i am a student "; 将字符串常量"I am a student"的值,就是该字符串在内在中的首地址赋给point。
我觉得这很有道理,但hqx说绝对不允许出现这样的定义。我实在是不明白,
请各位赐教
[/QUOTE]
我也不明白?为什么呢?谢谢
2006-05-05 21:46
feng1256
Rank: 4
等 级:贵宾
威 望:14
帖 子:2899
专家分:0
注 册:2005-11-24
收藏
得分:0 

因此,定义或输入字符串时,请千万注意:我的字符串到底存放在哪里?
char s1[] = "hello";
void main()
{
char s2[] = "hello";
static char s3[] = "hello";
char *p1 = "hello";
char *p2 = (char *) malloc (10);
strcpy(p2, "hello");

....
free(p2);
p2 = NULL;
}
s1, 全局变量,静态存储区,整个程序内有效
s2 局部变量,栈,函数局部有效
s3 函数内部静态变量,只在第一次定义时分配内存初始化,整个程序内有效
p1 指向一个常量字符串,绝对不允许出现这种定义!谭浩强的书上有这种定义,这家伙
懂一点语法就到处出书,误人子弟!他的C程序设计很多错误。
p2 函数局部变量,堆,整个程序有效
多文件工程static 还有其他用途:将某个变量限制在一个编译单元内。

大体是赞同的,不过关于p1的描述有点异议

p1这样定义是可以的,它取得了串的首地址(串先已存储)
只是利用p1只可以做引用性操作,不能做修改操作(有些笨编译器好象可以)

不同于 char *p;
*(p+1)='a';
因为这个先定义的指针,但指针所指向地址的内存后续单元是不可欲知的
所以这样的操作有极大的危险


叁蓙大山:工謪、稅務、嗣發 抱歉:不回答女人的问题
2006-05-05 22:58
soft_wind
Rank: 3Rank: 3
等 级:新手上路
威 望:8
帖 子:1430
专家分:0
注 册:2006-4-5
收藏
得分:0 

我是绝对赞成用字符指针数组的!
下面举个例子说明,这个指针数组还是好用的,而且还必须这样用。
/*
该函数用来处理程序出错.
*/
void doerror(int num)
{
static char *error[]={"can't find the file.\n","read error!\n","write error!\n","no enough memory!\n"};
printf("%s",error[num]);
}
其实呢,用指针直接指向一字符数组还是好用的,君不见,命令行变量argv也是字符指针数组吗?

[此贴子已经被作者于2006-5-6 9:09:05编辑过]


对不礼貌的女生收钱......
2006-05-06 09:08
快速回复:[讨论]再请教一个指针问题
数据加载中...
 
   



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

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