#include <iostream>using namespace std;int main( ){ void sort(char *name[],int n); //声明函数 void print(char *name[],int n); //声明函数 char *name[]={"BASIC","FORTRAN","C++","Pascal","COBOL"}; //1.这里我理解不是指针数组name里的元素是存放了指向各个字符串的首地址,有错吗?就是name[0]是存放里“BASIC”里的B的首地址。因为是char类型。 int n=5; sort(name,n); print(name,n); return 0;}void sort(char *name[],int n){ char *temp; int i,j,k; for(i=0;i<n-1;i++) { k=i; for(j=i+1;j<n;j++) if(strcmp(name[k],name[j])>0) k=j;//2,这里我理解name[k]都是地址内容,*name[k]才是取值吧?这样比较地址我就迷糊里? if(k!=i) { temp=name[i];name[i]=name[k];name[k]=temp; //3.temp=name[i]不是正好说明赋值的是地址? } }}void print(char *name[],int n){ int i; for(i=0;i<n;i++) cout<<name[i]<<endl;//4.既然说指针数组存放的都是指针变量,而指针变量存放的是地址,这样输出不是输出的存放的地址值?}解惑不胜感激,
解答如下:1、指针数组名name共有5个元素,分别是name[0],name[1],...name[4] 而它的每一个元素保存的都是地址,该地址类型为char *。这点我们无需怀疑。 name[0]保存的是"BASIC" 这个字符串的首地址,即B的地址,那么也就是顺理成章的事了,因为指针数组的每个元素都是保存是地址嘛; 同理 name[1]保存的是"FORTRAN" 这个字符串的首地址,即F的地址; 后面的元素同理。2、name[k] 保存的是第k组字符串的首地址,我假设第k组字符串是"COBOL"那么,name[k]就等于"COBOL"里C的地址。 同理*name[k] 就是取它的内容即 'C'3、temp=name[i] 是取name[i]保存的地址赋值给temp。因为它们的类型相同,即它们的类型都是char *。4、是的,你的理解是正确的,指针数组确实是保存的是地址,这点无需怀疑。它之所以输出的是内容而非地址。是因为C++对<<流插入运算符进行了重载,如果右运算符(即右侧的对象)是字符串的地址的话,则会输出它的内容,直至遇到'\0'为止。
1.存放的是地址,没错!2.strcmp(char *a,char *b) 比较的是a,b所指向的字符串(也就是以a,b为首地址的字符串)的大小。3.赋值的是地址4.<<是一个操作符函数,他后面的东西是参数,在这里,也就是name[i],name[i]是一个char型指针,<<把他当作字符串首地址,所以输出字符串。<<这个函数的原型我没见过,不过大概应该类似这样的ostream & operator<< (std::ostream & os, const char * ch)