标签:错误 primer out 算术 方式 rom 右值 不同的 pre
指针和数组基本等价的原因在于指针算术和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)
这部分参考微博: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指向的单元是可以改变的,一般读做常量指向
常量指针:指针的值不能改变,但是自身是一个变量,读作指向常量
数组名是数组的首地址
a)含义:
声明一个数组 : TYPE arrayname[N];
有两层含义:1.arrayname是一个数组,类型是TYPE[N]
2.array是一个常量指针,指针的类型是TYPE *,指向类型是TYPE,指向的值是数组的第0号元素,注意arrayname和数组第0号元素的地址是不同的,arrayname是指针常量,arrayname++是错误的。
b)功能
sizeof(arrayname) | arrayname代表的是数组本身,得到的是整个数组的大小 |
*arrayname (等同 arrayname[0]) | arrayname代表的是指针,得到的是数组第0号元素的值 |
arrayname+i | arrayname代表的是指针,得到的是指针向后偏移i个指向类型的单位的指针 |
补充:sizeof(对象)测出的都是对象自身的类型大小
标签:错误 primer out 算术 方式 rom 右值 不同的 pre
原文地址:http://www.cnblogs.com/sxy-798013203/p/7754858.html