[C指针]指针与数组:int vector[5]; int *pv = vector; sizeof(pv)与 sizeof(vector)

学习笔记

《深入理解C指针》
http://www.ituring.com.cn/book/1147
第4章 指针与数组

1、指针概述

一维数组、二维数组

[C指针]指针与数组:int vector[5]; int *pv = vector; sizeof(pv)与 sizeof(vector)_第1张图片
二维数组

如果只用一个下标访问二维数组,得到的是对应行的指针
数组很特殊,&matrix[i]matrix[i]都是取出指针里面存的内容

[C指针]指针与数组:int vector[5]; int *pv = vector; sizeof(pv)与 sizeof(vector)_第2张图片
访问数组

2、指针表示法与数组

[C指针]指针与数组:int vector[5]; int *pv = vector; sizeof(pv)与 sizeof(vector)_第3张图片
指针表示法与数组

数组和指针的差别

(1)vector[i] 与 *(vector+i) 生成机器码不同

  • 假设这里,我想取出vector[2] = 3
  • 反汇编
mov DWORD PTR [rbp-32], 1
    mov DWORD PTR [rbp-28], 2
    mov DWORD PTR [rbp-24], 3
    mov DWORD PTR [rbp-20], 4
    mov DWORD PTR [rbp-16], 5
  • vector[i],从vector处开始,移动i个位置,取出内容
mov edx, DWORD PTR [rbp-24]
  • *(vector+i),从vector地址开始,给这个地址加上i,从新地址里取出内容
lea rax, [rbp-32]
add rax, 8

(2)sizeof(pv)与 sizeof(vector)

[C指针]指针与数组:int vector[5]; int *pv = vector; sizeof(pv)与 sizeof(vector)_第4张图片
Visual studio 2019

[C指针]指针与数组:int vector[5]; int *pv = vector; sizeof(pv)与 sizeof(vector)_第5张图片
GNU GCC v7.1.1)
  • sizeof(vector)数组的字节数
  • sizeof(pv)指针的长度,机器不同,编译器不同,指针长度可能不同

(3) 数组名vector 不是左值,不可被修改

3、用malloc创建一维数组

[C指针]指针与数组:int vector[5]; int *pv = vector; sizeof(pv)与 sizeof(vector)_第6张图片
用malloc创建一维数组
  • 分配一块内存并把它当成数组,其长度在运行时确定

你可能感兴趣的:([C指针]指针与数组:int vector[5]; int *pv = vector; sizeof(pv)与 sizeof(vector))