c语言的数组指针与指针数组

1. 数组指针:指向数组的指针是数组指针

先看下面一段代码:

#include <stdio.h>

int main(void)
{
    int m[10];

    printf("m = %p, &m = %p
", m, &m);
    printf("m + 1 = %p, &m + 1 = %p
", m + 1, &m + 1);

    return 0;
}

运行上面的代码得到的结果如下图:

上面代码中&m是指向数组的指针,也就我们说的数组指针,它在m在数值上是完全相等的,都指向的是同一段内存的起始地址经网友garbageMan指正,改为 “分别指向的是具有同一起始地址的两段(块)内存”。但是它们的类型确是不同的。其中m是 int *型的指针;而&m指向的是int m[10]这样一个数组,是一个数组指针,因此m +  1 相当于加上 sizeof(int),由上图可以计算(0x0028FEFC - 0x0028FEF8) =  4; 而&m + 1相当于加上sizeof(int[10]),由上图中的计算(0x0028FF20 - 0x0028FEF8) = 40。

可以有如下定义:

int (*p)[10] = &m; 这里p就是一个数组指针,并且这里(*p)的括号是必须的,()的优先级高于[],因此p首先是一个指针,然后指向的是int [10]的数组。

2. 指针数组:由多个指针组成的数组是指针数组

int *p[10]; 这里可以和上面数组指针做对比。p首先是一个数组,然后类型是指针,因此p是指针数组(含有10个指针,例如p[0]、p[1]。。。p[9],每个指针的类型为int *),它的每个变量都可以用来存放地址。

原文地址:https://www.cnblogs.com/jaydenhpj/p/4436012.html