(C)指针与数组 的那些事

要清楚指针和数组,必须清楚三个问题:

  1. 什么是指针?
  2. 什么是数组?
  3. 指针和数组之间的联系?

  • 数组:根据元素个数和元素类型,开辟一段连续的空间,以一个标识符来标识这段空间

这里写图片描述

  • 指针:用来存储地址的数据类型。32位下为4字节,64位下为8字节
    这里写图片描述

    一、指针与数组的区别:
    1、把数组作为参数传递的时候,会退化成指针
    2、数组名可作为指针常量 ,例如 :
    这里写图片描述
    会编译出错,数组名可以转换为指向其指代实体的指针,但是它只能被看作一个指针常量,不能被修改。
    3、数组和指针的内存分配:
    数组是开辟一段连续的存储空间,数组本身的标识符代表整个数组,可以用sizeof求取其真实大小,
    指针是只分配一个指针大小的内存,并可把他的值指向一个有效的内存空间

    二、指针和数组的联系:

    1.访问指针

char *p = “abcdef”;       读取字符e
  • 以指针形式: * (p+4),先取出p里存储的地址值,然后加上4个字符的偏移量,p+4位e的地址。*(p+4)就读取了e

  • 以下标的形式:
    p[4] ,以下标的形式访问在本质上与以指针的形式访问没有区别,只是写法上不同罢了

    2.访问数组:

char a[] = “123456
  • 以指针的形式:
    *(a+4) , a为数组首元素的地址,加上4字节的偏移量

  • 以下标的形式:
    a[4] , a 为数组首元素的首地址,加上中括号中 4 个元素的偏移量

三、&a[0]和&a的区别:
a[0]是一个元素,a是整个数组,虽然值一样,但意义不一样,&a[0]代表数组首元素的地址,&a是整个数组的首地址,例子:湖南的省政府在长沙,而长沙的市政府也在长沙。两个政府都在长沙,
&a + 1: 表示下一个数组的首地址
a+1:表示数组下a[1]的地址

地址计算:
char a[]=”abcdef”
假设首地址为0x9fff0
这里写图片描述

五、指针和数组特性总结:
这里写图片描述

六、指针数组和数组指针:

  • 指针数组:
    首先它是一个数组,数组的元素都是指针,数组占多少字节有数组本身决定
  • 数组指针:
    首先它是一个指针:它指向一个数组,32位占4字节,64位占8字节,他指向的数组占多少不知道

七、二维数组:
可以想成一个以为数组,每个元素里存储一个数组
char a[3][4];

  • 地址计算
    a[i]的首地址为 :& a[0]+ i*sizof(char)*4。
    a[i][j]的首地址为:&a[i]+j*sizof(char)
    a[i][j]元素的首地址为:a+ i*sizof(char)4+ j*sizof(char)。也可表示为(*(a+i)+j)

例如:
int a[5][5];
&a[4][2]=&a[0][0]+4*5*sizeof(int) + 2*sizeof(int)

详细内容请看《C语言深度解剖》

注:图片都来自《C语言深度解剖》

猜你喜欢

转载自blog.csdn.net/ddcodingya/article/details/81738864