1,指针是数组的迭代器。
2,给指赋值的情况:
不能出现如下情况,
int a=0;
int *p=a; 这个是错误的。首先是他们的数据类型不一致,,其次是因为a的值不能在编译时确定。编译时的错误信息是 “无法将 int 转化为 int*”
但是
const int a=0;
int *p=a; 这个就可以编译通过,因为a的值 在编译时是可以确定的。
在又有 如果
const int a=8989;
int *p=a; 编译照样不过,a!=0都不过, 诶C++的编译器,真是奇怪。。。。
这里有一个编译器变量NULL ,其值为0;
所以可以用
int* p=NULL;
3.void * 指针。
void * 指针 是可以指向任何类型的指针,在取值要强制类型转换
4. C++中 数组和指针关系密切,特别是在表达式中使用数组名时,该名字会自动转换为指向数组第一个元素的指针。
比如
int ia[]={1,2,3,4};
int *ip=ia;
5.在使用下标访问数组时,实际上是对指向数组元素的指针做下标操作,
比如:
int a[5]={1,2,3,4,5};
int* p=&a[4];
cout<<a[4]; 即使 *(a+4)
cout<<p[-2]; 这里当然就是 *(p-2)了;
6. 指向const对象的指针。
如果一个指针的 声明是 const type * p; 比如
int a=99;
const int* pa;
pa=&a;
//pa=788; 这里会编译出错
a=776;
我们应该把 这种声明的指针理解为 自以为是指向的对象是const的。其实未必啊,比如上面的就是。
7.关于数组如何分配,数组变量有三个重要的限制,数组长度固定不变,在编译时必须知道其长长度,数组只在定义它的语句块内存在。实际上程序是不能够忍受这样的限制的。他们需要动态创建。
8.初试化在对中分配的 const数组,也就是说数组在堆中,每个元素是const的。
const int *p=new int[4]();
p[1]=33; 编译出错,不能给常量赋值,但是这样的变量有什么用呢??
9. 重string 类型获取 char* 类型。可以用c_str()
比如 string ss="asdfasdf";
char *c=ss.c_str() (估计这里只是返回了一个string 类的内部成员指针而已)
因为
string s="asd";
const char *t=s.c_str();
s[0]='A';
cout<<t<<endl;
输出结果是 Asd
10,数组的数组
图中的解释够清楚了