1. 指针有等级。对不同等级的指针进行同样的操作,结果是不一样的,即便这两个指针的值是相等的。
int arr【10】【15】;这里的arr就是一个指向arr【0】这个一维数组的指针,它的等级是一维数组级的。
*arr也是一个指针,但它是指向arr【0】的第零个元素arr【0】【0】的,它的级别是整形变量级的。
arr+1指向的是arr【1】,*arr+1指向的arr【0】【1】。级别体现出来了。
2. 如果p是一个指针,那么方括号运算符和星号运算符有个等价的结合点:*(p+i)和p【i】是等价的。
所以,*arr和arr【0】是等价的,因为*arr就是*(arr+0)。
3. 数组元素名是指针,但是是常量,即arr是个常量,所以不能对它进行修改,arr++是错误的
4. 定义一个数组等级的指针的方法:类型 (*p)【数组大小】。如int (*p)【15】;就定义了一个指向
包含15个元素的数组的指针。注意,*p的圆括号不可少,因为方括号的优先级高于圆括号,如果写成
int *p【15】就变成定义一个指针数组了,意思是:p是一个数组,里面存放的是指针。
5. 指向数组的指针不一定是数组指针,比如char *p[]={"ABCD","EFGH","IJK","LMNOPQRST"},这里的p是指向数组的吧,
但是它却不是数组指针,p+1的单位不是p数组的大小,而是char*的大小。指针数组是需要显式定义的。
呵呵,纯属个人感悟,如有不对,请不吝赐教!!
测试程序:
#include "stdafx.h"
#include<iostream>
using namespace std;
void arrayTest(char (*s)[5])
{
for(int i=0;i<5;i++)
cout<<*(*s+i)<<endl;//记住:p[i]就是*(p+i);s是指向一维数组 的指针,那么他加一就是加一个数组的长度
//cout<<s[i]<<endl; //所以,p+i不是a所指的数组的第p个元素,而是p后面i个p数组长度的地址!!
//cout<<*(s+i)<<endl; //如果要找到p所指的数组的第i个元素,必须将p这个指针降级!即加个星号*变成*p,这样*p[i]就是
//cout<<(*s)[i]<<endl;//第i个元素的值,或者*(*p+i)也是。
}
void arrayTestChar(char *s)
{
for(int i=0;i<5;i++)
cout<<*(s+i)<<endl;
}
void main(int argc, _TCHAR* argv[])
{
char arrTwo[][5]={{'a','b','c'},{'d','e','f','g','h'},{'i','j','k','l'}};
for(int i=0;i<3;i++)
{
//arrayTest(arrTwo+i);
arrayTestChar (*(arrTwo+i));
cout<<endl;
}
}
运行结果:
a
b
c
d
e
f
g
h
i
j
k
l
/****************end ******************************************************/