1、指向数组的引用
int num[10];
int (&rNum)[10] = num;
cout << rNum[1] << endl;
2、指向数组的指针
int num[10];
int (*pNum)[10] = #
cout << (*(pNum))[1] << endl;
注:int[] 和 int*不是同一种类型
补:指针类型数组
int A[3][5]={{1,2,3,4,5},{6,7,8,9,10},{11,12,13,14,15}};
int *p[3],**pA;
p[0]=A[0];//保存每行的行首地址到指针数组p
p[1]=A[1];
p[2]=A[2];
pA=p;//行首地址指针数组的首地址=》pA,注意是指针的指针。
printf("第1行第2个数%d\n",*(*(pA+1)+2));
补:区分指向数组的指针和指针类型数组的简单方法是,看有没有括号,因为括号运算符的优先级是最高的,如果有括号把星号括住,说明这是个指向数组的指针,如果没有括号,则表示这是个数组。
3、指向类成员的指针
指向类成员的指针并非一般意义上的指针,它的值并非是一个真实的地址,而像是一个类成员在类中的偏移
struct stru
{
int a;
CString b;
};
int stru::* pA = &stru::a;
CString stru::* pB = &stru::b;
类似于使用普通类成员对象的标识符. 使用类成员指针的关键字是.*或->*
stru s;
s.*pA;// 使用成员a
s.*pB;// 使用成员b
4、指向类数组成员的指针
struct stru
{
int a;
CString b;
TCHAR szE[10];
};
stru s11;
// 定义一个指向stru的szE[10]数组的指针
char (stru:: *pC)[10] = &stru::szE;
// 访问数组用的一个元素
char c = (*(&(s11.*pC)))[1];// VC6,编译器的问题,必须先&再*,绕一下
char c = (s11.*pC)[1]; // VS2010,可直接用
// 访问整个数组
CString ss = (*(&(s11.*pC)));// VC6
CString ss = s11.*pC;// vs2010
5、二维字符串数组指针
// 假设目标是8个长度为5的字符串
int nNum = 8, nLen = 5;
char *pA[1];// 不必定义为 char *pA[8]
// malloc出内存的目的是存字符串,所以它一定是要赋予char*类型
/* 方法1 */
pA[0] = (char*)malloc(nNum*nLen);
memcpy(pA[0], "abc", 4);
memcpy(pA[0] + nLen, "def", 4);
printf("%s\n", pA[0]);
printf("%s\n", pA[0] + nLen);
free(pA[0]);
/* 方法2 */
// 假设有个字符串首地址是m,char*类型的q变量存的是字符串首地址m,
// char**类型的p变量存的则是q变量自身的地址,因此在p和m之间必然
// 需要一个变量充当q的作用,因此单独定义的char** p是无法使用它
// 操作目的字符串的。
char **p;
p = pA;
*p = (char*)malloc(nNum*nLen);
memcpy(*p, "abc", 4);
memcpy(*p + nLen, "def", 4);
printf("%s\n", *p);
printf("%s\n", *p + nLen);
free(*p);