1.在多维数组中,指向低维数组的指针并不是普通的指向指针的指针。
2.在指针的使用上一定要清除哪些是常量,哪些是变量,
还要清楚指针指向的是变量还是常量。
只有指针变量才能进行增减操作
数组标记法和指针标记法最大的区别就是前者是常量,不能成为左值。
例如一维数组中:
int a[8];
int* p=a;
p++; (正确)
a++; (错误)
二维数组中:
int a[3][5];
int (*p)[5];
p=a;
p++;(正确,因为p是一个指针变量)
*p++; (错误,因为*p=a[0],这是一个常量,无法递增,只能使用*p+i这样的表达式来进行遍历)
在字符串中也是一样,区别在于字符串常量储存在静态区域,如果用数组标记法赋值,则在内存中另外复制了一个数组块,可以更改。而直接用指针标记法赋值,则无法更改字符串常量。
3.函数返回一个指向二维数组的指针
如果要定义返回一个指向二维int数组(低维数组大小是5个)的指针,
写法是
int *(func())[5] {……}
4.一定要注意,不要让指针指向局部变量。因为函数一旦结束,变量地址就释放了,指针指向的内容变得不可预料。如果指向在函数中定义的常量,一定要加上static
如
int *(func(void))[3]
{
int a[2][3]={1,2,3,4,5,6};
return a;
}
如果在主程序中调用打印a,会出现不可预料的结果,必须要在数组常量前加上static:
int *(func(void))[3]
{
static int a[2][3]={1,2,3,4,5,6};
return a;
}