c++指针数组的的引用问题。

#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个回答  2015-03-24
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)
相似回答