指向数组的引用;指向数组的指针;指向类成员的指针;指向类数组成员的指针;二维字符串数组指针

来源:互联网 发布:百度春运迁徙大数据图 编辑:程序博客网 时间:2024/06/06 11:04
1、指向数组的引用
int num[10];
int (&rNum)[10] = num;
cout << rNum[1] << endl;

2、指向数组的指针
int num[10];
int (*pNum)[10] = &num;
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);


原创粉丝点击