C/C++语言指针用法详解 (六) 指针和数组

标明出处,欢迎转载!!!

知识至上,欢迎指正!!!


 

1.定义

指针和数组基本等价的原因在于指针算术和C++内部处理数组的方式。  ——《C++PrimerPlus》第五版

 

在多数情况下,C++将数组名解释为数组中第一个元素的地址。

   int arr[10] = {1,2,3,4,5};
   int *p = arr;
   cout<<" -------------- 3 种方式得到数组的地址 ------------------- "<<endl;
   cout<<"arr     -> "<<arr<<endl;
   cout<<"&arr[0] -> "<<&arr[0]<<endl;
   cout<<"p       -> "<<p<<endl;
   cout<<" -------------- 4 种方式得到数组的值 ------------------- "<<endl;
   cout<<"arr[1]     -> "<<arr[1]<<endl;
   cout<<"*(arr+1)   -> "<<*(arr+1)<<endl;
   cout<<"*(p+1)     -> "<<*(p+1)<<endl;
   cout<<"p[1]       -> "<<p[1]<<endl;

 

总结:

arrayname[i]    等价于  *(arrayname+i)  

2.指针数组和数组指针

这部分参考微博:http://www.cnblogs.com/Romi/archive/2012/01/10/2317898.html

指针数组:array of pointers,即用于存储指针的数组,也就是数组元素都是指针

数组指针:a pointer to an array,即指向数组的指针

还要注意的是他们用法的区别,下面举例说明。

int* a[4]     指针数组     

                 表示:数组a[4]是指针,指针的类型是int*,指针的指向类型是int

                 元素表示:*a[i]   *(a[i])是一样的,因为[]优先级高于*

int (*a)[4]   数组指针     

                 表示:a是指针的类型是int*[4], 指针的指向的类型为int()[4]

                 元素表示:(*a)[i]  

#include<bits/stdc++.h>
using namespace std;
int main()
{
   /***   指针数组
    ** <数组 pstr[3],数组的元素是指针>  三省指针:指针的类型是 int * ,指向的类型是int ,数组内每个指针分别指向 三个字符串的首地址
    ***/
   char *pstr[3] = {
    "Socialism",
    "with",
    "Chinese"
   };
   cout<<" pstr[0]  "<<pstr[0][0]<<endl;;
   cout<<" pstr[1]  "<<pstr[1]<<endl;;
   cout<<" pstr[2]  "<<pstr[2]<<endl;;

   /***   数组指针
    ** <指针 pstr1>  三省指针:指针的类型是 int (*)[20] ,指向的类型是int()[20] ,指针指向 str1
   ***/
   char str1[20] = "Characteristics";
   char (*pstr1)[20] = &str1;
   //b=&str1;
   cout<<" *pstr1   "<<*pstr1<<endl;;
}

 

注意:字符串相当于一个数组常量,内容不可改变,且只能为右值,如果看成指针,即是常量指针也是指针常量

指针常量:该指针是一个常量,不可改变,指向某一个地址就不能改变,但是0指向的单元是可以改变的,一般读做常量指向

常量指针:指针的值不能改变,但是自身是一个变量,读作指向常量

3.数组首地址的总结

数组名是数组的首地址

a)含义:

声明一个数组  :   TYPE  arrayname[N];

有两层含义:1.arrayname是一个数组,类型是TYPE[N]

                      2.array是一个常量指针,指针的类型是TYPE *,指向类型是TYPE,指向的值是数组的第0号元素,注意arrayname和数组第0号元素的地址是不同的,arrayname是指针常量,arrayname++是错误的。

b)功能

sizeof(arrayname)   &arrname   arrayname代表的是数组本身,得到的是整个数组的大小 此时  &arrname 表示的是 指向是整个数组
*arrayname (等同 arrayname[0])  arrayname代表的是指针,得到的是数组第0号元素的值
arrayname+i arrayname代表的是指针,得到的是指针向后偏移i个指向类型的单位的指针

补充:sizeof(对象)测出的都是对象自身的类型大小

 

posted @ 2017-10-30 15:54  799  阅读(1100)  评论(0编辑  收藏  举报