欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2024-02-29 23:31:22
...

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

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

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

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

  • 指针:用来存储地址的数据类型。32位下为4字节,64位下为8字节
    (C)指针与数组 的那些事

    一、指针与数组的区别:
    1、把数组作为参数传递的时候,会退化成指针
    2、数组名可作为指针常量 ,例如 :
    (C)指针与数组 的那些事
    会编译出错,数组名可以转换为指向其指代实体的指针,但是它只能被看作一个指针常量,不能被修改。
    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
(C)指针与数组 的那些事

五、指针和数组特性总结:
(C)指针与数组 的那些事

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

  • 指针数组:
    首先它是一个数组,数组的元素都是指针,数组占多少字节有数组本身决定
  • 数组指针:
    首先它是一个指针:它指向一个数组,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语言深度解剖》