C和指针——读书笔记(二)

  最近频繁地用到数组,又看了《C和指针》数组这一章,所以决定写一些东西,分享一下。
  

提到数组,很多人都会提到指针。在C语言中,数组名是一个指针常量(意味着你不能修改此常量的值)。为什么呢?我们想一下,数组名,是数组首元素的地址,也就是内存中数组的起始位置。如果修改这个指针常量,唯一可行的就是把整个数组移动到内存中的其他位置。但是在程序完成连接后,内存中数组的位置已经固定了,所以再移动就为时已晚了。

一.一维数组

void func1(int* a)
{
    printf("一维数组分析\n");
    int* ap = a+2;
    printf("*(a+2))=%d\n",*(a+2));
    printf("a[2]=%d\n",a[2]);
    printf("ap[0]=%d\n",ap[0]);
    printf("ap+2=%d\n",ap+2);
    printf("&a[4]=%d\n",&a[4]);
    printf("*(ap+2)=%d\n",*(ap+2));
    printf("*ap+2=%d\n",*ap+2);
    printf("ap[-1]=%d\n",ap[-1]);

}

int a[5] = {1,2,3,4,5};
int* ap = a+2;

C和指针——读书笔记(二)_第1张图片

(1)(a+2)即先执行(a+2),这个时候是a[2]的地址,再执行取内容操作,(a+2)就是a[2]的值。也就是ap[0]的值。

    printf("*(a+2))=%d\n",*(a+2));
    printf("a[2]=%d\n",a[2]);
    printf("ap[0]=%d\n",ap[0]);

(2)表示指针指向的元素向后移动2个整数位置的元素,因为ap[0]=a[2],所以ap+2=&a[4]

    printf("ap+2=%d\n",ap+2);
    printf("&a[4]=%d\n",&a[4]);

(3) printf(“ap[-1]=%d\n”,ap[-1]);ap[-1]指向a[1]=2

二.二维数组

多维数组在内存中存储的情况eg.int martix[3][3]

C和指针——读书笔记(二)_第2张图片

三个虚线框分别表示第一维、第二维、第三维
下面分析

void func2(int (*mat)[10])
{
    printf("\n\n二维数组分析\n");
    printf("mat=%d\n",mat);
    printf("&mat[0][0]=%d\n",&mat[0][0]);
    printf("mat+1=%d\n",mat+1);
    printf("&mat[1][0]=%d\n",&mat[1][0]);
    printf("*(mat+1)=%d\n",*(mat+1));
    printf("*(*(mat+1))=%d\n",*(*(mat+1)));
    printf("mat[1][0]=%d\n",mat[1][0]);

}

main函数:

    int martix[3][10] = { {1,2,3,4,5,6,7,8,9,0},
                            {11,12,13,14,15,16,17,18,19,10},
                            {21,22,23,24,25,26,27,28,29,30}
                        };

    func2(martix);

(1)mat=&mat[0][0]为数组的首地址;
(2)mat+1=&mat[1][0],表示一维指针向下移动一个;移动到二维的第一个元素即mat[1][0];
(3*(*(mat+1))=mat[1][0],取(2)中的地址的内容,即mat[1][0];

C和指针——读书笔记(二)_第3张图片

此处func2的原形可以为void func2(int (*mat)[10]) 也可以为void func2(int mat[][10])

你可能感兴趣的:(读书笔记,数组,C语言,指针)