首页 > 编程语言 > 详细

C/C++ 指针数组和数组指针的认识

时间:2021-06-24 22:44:10      阅读:25      评论:0      收藏:0      [点我收藏+]

?

指针数组

指针数组的理解: 指针数组顾名思义是指针组成的数组, 组成元素是指针变量。

字符串初始化指针数组:

#include<stdio.h>

int main(void) {

    char *a[3] = { "hello", "world", "good" };    // 定义指针数组a[],并对其初始化,把字符串的首地址赋给它.
    char  **p;
    p = a;

    for (int i = 0; i < 3; i++) {
        printf("*p: %%d = %d\n", *p);        //这个输出的是各字符串的首地址.
        printf("*p: %%s = %s\n", *p);
        printf("**p: %%d = %d\n", **p);    //输出各字符串首各字母h w  g的  ascii码值
        printf("**p: %%c = %c\n", **p);    //输出各字符串首字母       
        printf("*p++: %%s = %s\n", *p++);    //输出字符串,%s --给它字符串的首地址就好了!
        printf("------------\n");
    }

    return 0;
}

运行:

*p: %d = 8944628
*p: %s = hello
**p: %d = 104
**p: %c = h
*p++: %s = hello
------------
*p: %d = 8944432
*p: %s = world
**p: %d = 119
**p: %c = w
*p++: %s = world
------------
*p: %d = 8944460
*p: %s = good
**p: %d = 103
**p: %c = g
*p++: %s = good
------------

指针数组的初始化可以分开写:

char *a[3];
a[0] = "Hello";
a[1] = "World";
a[2] = "Good";

int 型数组:

#include

int main(void) {

    int a[3] = { 1, 2, 3 };
    int  **p;
    int *m[3];

    for (int i = 0; i < 3; i++) {
        m[i] = &a[i];
        p = &m[i];
        printf("m[%d] = %d\n", i, **p);
    }

    return 0;
}

运行:

m[0] = 1
m[1] = 2
m[2] = 3
请按任意键继续. . .

顺便测试下二级指针。

代码不能写成这样子:

int *a[3] = { 1, 2, 3 };

这样是错误的,指针变量 a 应该赋值地址给它,这样是一个 int 常量,错误!

数组指针

数组指针就是指向数组的指针咯!

#include 

using namespace std;

int main(void) {
    int *p;
    int a[3] = { 3, 2, 1 };
    p = a;
    for (int i = 0; i < 3; i++) {
        cout << ‘a‘ << ‘[‘ << i << "] = " << *(p + i) << endl;
    }

    return 0;
}

运行:

a[0] = 3
a[1] = 2
a[2] = 1
请按任意键继续. . .

m 个元素组成的一维数组的指针变量——int (*p)[m]的理解:

#include

int main() {

    int a[6] = { 0, 1, 2, 3, 4, 5 };
    int(*pt)[6] ;
    pt = &a; // 相当于含一个一维数组的二维数组,这里必须加取地址符 &,
    // 可以直接写成: int (*pt)[6] = &a;  // 不能写成 int (*pt)[6] = a;

    printf("**pt = %d\n", **pt);
    printf("*(*pt + 1) = %d\n", *(*pt + 1));
    printf("*(*pt + 2) = %d\n", *(*pt + 2));
    /* ... */

    return 0;
}

运行:

**pt = 0
*(*pt + 1) = 1
*(*pt + 2) = 2
请按任意键继续. . .

其实是可以这样理解的:一对[]等价于一个*;所以,int(*pt)[6]可以理解为双重指针,它只能指向含有 6 个元素 (int) 的一位数组,上例改为int (*pt)[8] = &a // 或者不是 8 的其他数字。就会出错。

#include

int main() {

    int a[3][4] = { { 1, 2, 3, 4 },
                    { 5, 6, 7, 8 },
                    { 9, 10, 11, 12 }
    };
    int(*p)[4], i, j;

    p = a;
    printf("请输入你想要输出元素的行和列:");
    scanf_s("%d,%d", &i, &j);
    printf("a[%d][%d]=%d\n", i, j, *(*(p + i) + j));
    // 从第 0 行开始输出a[i][j].

    return 0;
}

``
请输入你想要输出元素的行和列:1,2
a[1][2] = 7
请按任意键继续. . .

这里用二维数组就比较好理解了,指向含有 4 个元素的一维数组。

note: 指针变量就是用来放地址的,指针变量存放的值就是地址。宏观讲,指针就是地址地址就是指针。

?
?

C/C++ 指针数组和数组指针的认识

原文:https://www.cnblogs.com/huvjie/p/14928638.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!