美文网首页C语言
指针与数组

指针与数组

作者: 风情云 | 来源:发表于2020-03-09 20:44 被阅读0次

指针与数组

指针数组,数组指针,指针法访问数组,分不清如何使用,下面将帮你疏通思路,更好理解他们的关系。

数组名的本质

    int array[5];
    printf("array = %o\n",array);
    printf("&array = %o\n",&array);
    printf("&array[0] = %o\n",&array[0]);
代码结果

由结果可以得知,数组名是一个地址,指向数组的首地址。那样我们就可以通过指针来操作数组元素。

指针法操作数组元素

可以通过*array来操作数组的首元素,但如果想要操作第二个元素,要怎么办呢?地址也是可以进行运算操作的,通过改变地址的值来指向不同的内存,这样就有可能操作数组的第二个元素。
首先看看数组的元素地址


数组地址

可以看到数组元素地址是一段连续的地址,这样就有可能通过知道数组首地址,来操作数组的所有元素。上面的地址增量是4个字节,联想到该数组是int型,int型在32位平台占4个字节,所以这个增量是要看数组元素数据类型。

    int array[5];
    int *ptr = array;
    printf("ptr = %o\n",ptr);
    printf("ptr+1 = %o\n",ptr+1);
指针操作
可以看到ptr+1后地址开始由30177370变化为30177374,增量为4,这是为什么呢?这就有关指针步长了。指针步长指指针加1的长度增量。可以看到此时步长为4,4这个数字很熟悉,ptr是整型指针,整型在32位平台中占4个字节,和ptr指向的数组的元素地址增量一致。那么就可以通过指针来操作数组元素。所以对应类型的指针指向对应类型的数据,不然可能会出错。
    *(ptr+1) = 2;
    *(ptr+2) = 3;

也可以使用[ ]的形式操作, *与[ ]的效果一样,编译器内部做了处理。

    ptr[1] = 2;
    ptr[2] = 3;
过程

这种形式看起来ptr是一个数组名,阅读体验也不错。我一般是使用这种形式。但不能把ptr当作是一个数组,他本质还是一个指针。


ptr与array

指针步长在一维数组与二维数组

一维数组

    int array[5] = {1,2,3,4,5};
    printf("array: %u array+1: %u\n",array,array+1);
    printf("&array: %u &array+1: %u\n",&array,&array+1);
    printf("sizeof(array) = %d\n",sizeof(array));
指针步长

可以看到array与&array的指针步长不一样,array的步长为一个元素的字节数,&array的步长为一个数组的长度。
array是这个数组的首元素地址 +1的长度为一个数据类型长度
&array是这个数组的首地址 +1的长度为·一个数组类型长度

二维数组

    int array[2][3] = {1,2,3,4,5,6};
    printf("array[0]: %u array[0]+1: %u\n",array[0],array[0]+1);
    printf("array: %u array+1: %u\n",array,array+1);
    printf("&array: %u &array+1: %u\n",&array,&array+1);
    printf("sizeof(array) = %d\n",sizeof(array));
    printf("sizeof(array[0]) = %d\n",sizeof(array[0]));
二维数组指针步长
&array 这个二维数组的首地址 指针步长为整个二维数组
array 这个二维数组的首行地址,指针步长为每行的一维数组长度
*array 首行首元素地址,指针步长为元素的数据长度
*array 这个数组的首行首元素数据
这个对照array[ ]表示法就可以明白了,
等同于[ ]。
*array == array[0] 就表示首行首元素地址。也可以是 &array[0][0],&与一个[ ]抵消。
**array == array[0][0] 这样就很好理解了

注意事项

数组名不可以为左值,数组名虽然本质是一个地址,但这个只可以读,不可以修改。

    int array1[5];
    int array[5];
    int *ptr = array1;
    array = ptr;   //error,编译出错

指针与数组的简单介绍到此结束

相关文章

  • C语言的数组指针与指针数组(One)

    一、数组指针与指针数组: 数组指针<——>本质是指针 指针数组<——>本质是数组上图: 二、数组指针: int ...

  • C语言21 指针数组与数组指针

    C语言21 指针数组与数组指针 指针数组的定义 指针数组的赋值 结构体指针数组 分析下面的代码 数组指针的定义 数...

  • 指针数组 & 数组指针 & 函数指针

    一、指针数组 & 数组指针 普通数组: 即数组名a与(*p)等价,都代表数组的首地址,此为数组指针 指针数组: ...

  • 指针笔记

    指针数组和数组指针 数组指针是指向数组的指针,指针的值与数组首元素地址相同,但范围是整个数组,所以数组指针和数组名...

  • C语言特性(指针数组和指向指针变量的指针)

    指针数组和指向指针变量的指针 指针数组与main()函数形参 声明指针数组与声明普通数组的语法类似,其语法格式如下...

  • 指针

    指针数组与数组指针 在这里数组指针是指向数组的指针,其本质为指针,指向的对象是数组。由于数组的形式多样所以数组指针...

  • iOS 指针详解

    指针数组与数组指针在这里数组指针是指向数组的指针,其本质为指针,指向的对象是数组。由于数组的形式多样所以数组指针的...

  • 2019-09-18C语言复杂表达式与指针高级应用

    1.指针数组与数组指针 1.1、字面意思来理解指针数组和数组指针 (1)指针数组的实质是一个数组,这个数组中存储的...

  • 数组知识点

    数组指针与指针数组: int(*p)[4]; --定义数组指针p,指向含4个元素的一维整型数组的指针变量(是指针)...

  • c基础—指针运算和函数指针

    二级指针 数组和数组指针 采用指针遍历数组循环赋值 遍历 赋值 指针与数组的几种写法 函数指针(回调) 题目:监听...

网友评论

    本文标题:指针与数组

    本文链接:https://www.haomeiwen.com/subject/ynemdhtx.html