数组名和指针的区别?
数组名和指针有什么区别?定义一个数组inta[5];int*b=a;然后这样使用可不可以?intc=b[4];...
数组名和指针有什么区别?定义一个数组 int a[5]; int *b = a; 然后这样使用可不可以?int c = b[4];
展开
1个回答
展开全部
可以!下面是我学习数组和指针的总结: (1)指向数组首地址
对于一维数组a[10]:数组的首地址为a; 调用:p=a; *(a+i)或者*(p+i)
对于二维数组a[3][4]:整个数组的首地址为a[0];调用:p=a[0]; *(a[0]+i)或者*(p+i)。此时a代表数组第一行的地址。
(3)指向数组的每行
形如:
int a[3][4];
int (*p)[4]; p=a;
调用:*(*(p+i)+j)
例:
{int a[3][4]={1,3,5,7,9,11,13,15,17,19,21,23};
int (*p)[4],i,j;
cin>>i>>j;
p=a; //a代表的是数组第一行的首地址.
cout<<*(*(p+i)+j)<<endl;}
(4)指针数组
例如:(字符串数组指针法)
{char *name[]={"BASIC","C++","PASCAL","COBOL","SQL"};
cout<<name[0]<<endl;}
处理字符串还有以下方法:
(字符数组法,C-string法)
{char name[][30]={"BASIC","C++","PASCAL","COBOL","SQL"};
cout<<name[0]<<endl;}
(字符串数组法,string法)
{ string name[]={"BASIC","C++","PASCAL","COBOL","SQL"};
cout<<name[0]<<endl;}
三种方法的共同点是name[0]都是代表的"BASIC"的首地址而非其本身。
(5)指向指针的指针
形如 char **p;
例:
{ char **p;
char *name[]={"BASIC","PASCAL","C++","COBOL","SQL"};
p=name+2;
cout<<*p<<endl;
cout<<**p<<endl;}
分析:
*p=name[2]= "C++"的首地址,(通常所说一个字符串的“地址”实际上指的是它的“首地址”或者“起始地址”),用cout 输出的不是字符串的首地址而是整个字符串(只要把一个字符串的起始地址给它,cout就一直往后面输出,直到遇到结束符'\0'为止),为了证明这一点,请看:string a=“finish”;cout<<a<<endl;变量a中只是存放的“finish”的首地址,但是用cout却是把整个“finish”字符串全部输出。故:本例中第一个*p输出"C++",第二个**p代表"C++"的首地址的内容,即C。
在上一例中,name[0]为"BASIC"的首地址,输出"BASIC",若换成*name[0]则输出B,若换成name则代表整个数组的首地址(而不是单个字符串"BASIC"的首地址),所以此时输出的是整个数组的首地址。若用*name则输出整个数组的首地址的内容,即"BASIC"(可见字符串的首地址内容为单个字符,一维数组首地址的内容为它的第一个元素,对于二维数组,比如int a[3][4],a代表的是第一行的地址,所以cout<<a;是输出第一行的地址,而cout<<*a则是错误的用法,因为不可能将第一行的所有元素全部输出(除非这一整行是形如“finish”的字符串))。
对于一维数组a[10]:数组的首地址为a; 调用:p=a; *(a+i)或者*(p+i)
对于二维数组a[3][4]:整个数组的首地址为a[0];调用:p=a[0]; *(a[0]+i)或者*(p+i)。此时a代表数组第一行的地址。
(3)指向数组的每行
形如:
int a[3][4];
int (*p)[4]; p=a;
调用:*(*(p+i)+j)
例:
{int a[3][4]={1,3,5,7,9,11,13,15,17,19,21,23};
int (*p)[4],i,j;
cin>>i>>j;
p=a; //a代表的是数组第一行的首地址.
cout<<*(*(p+i)+j)<<endl;}
(4)指针数组
例如:(字符串数组指针法)
{char *name[]={"BASIC","C++","PASCAL","COBOL","SQL"};
cout<<name[0]<<endl;}
处理字符串还有以下方法:
(字符数组法,C-string法)
{char name[][30]={"BASIC","C++","PASCAL","COBOL","SQL"};
cout<<name[0]<<endl;}
(字符串数组法,string法)
{ string name[]={"BASIC","C++","PASCAL","COBOL","SQL"};
cout<<name[0]<<endl;}
三种方法的共同点是name[0]都是代表的"BASIC"的首地址而非其本身。
(5)指向指针的指针
形如 char **p;
例:
{ char **p;
char *name[]={"BASIC","PASCAL","C++","COBOL","SQL"};
p=name+2;
cout<<*p<<endl;
cout<<**p<<endl;}
分析:
*p=name[2]= "C++"的首地址,(通常所说一个字符串的“地址”实际上指的是它的“首地址”或者“起始地址”),用cout 输出的不是字符串的首地址而是整个字符串(只要把一个字符串的起始地址给它,cout就一直往后面输出,直到遇到结束符'\0'为止),为了证明这一点,请看:string a=“finish”;cout<<a<<endl;变量a中只是存放的“finish”的首地址,但是用cout却是把整个“finish”字符串全部输出。故:本例中第一个*p输出"C++",第二个**p代表"C++"的首地址的内容,即C。
在上一例中,name[0]为"BASIC"的首地址,输出"BASIC",若换成*name[0]则输出B,若换成name则代表整个数组的首地址(而不是单个字符串"BASIC"的首地址),所以此时输出的是整个数组的首地址。若用*name则输出整个数组的首地址的内容,即"BASIC"(可见字符串的首地址内容为单个字符,一维数组首地址的内容为它的第一个元素,对于二维数组,比如int a[3][4],a代表的是第一行的地址,所以cout<<a;是输出第一行的地址,而cout<<*a则是错误的用法,因为不可能将第一行的所有元素全部输出(除非这一整行是形如“finish”的字符串))。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询