L23数组指针分析

L23数组指针分析

指针是一种特殊的变量,与整数的运算规则为:

p+n <-->(unsigned int)p +n*sizeof(*p)

指针的比较规则:
1. 大小比较需要指针指向同一个数组
2. ==和 != 不需要
#include

a 和&a的区别

  1. a为数组是数组元素的地址
  2. &a为整个数组的地址
  3. a和&a的意义不同,其区别于指针运算
    1. a+1 –> (unsigned int)a+sizeof(*a)
    2. a+1指向下一个元素
    3. &a+1–>(unsigned int)(&a)+sizeof(*&a)
    4. &a+1指向数组的结尾(最后一个元素的后面)

面试题

#include <stdio.h>

int main()
{
    int a[5] = {1, 2, 3, 4, 5};
    int* p1 = (int*)(&a + 1); 
    int* p2 = (int*)((int)a + 1);
    int* p3 = (int*)(a + 1);

    printf("%d, %d, %d\n", p1[-1], p2[0], p3[1]);

    return 0;
}

输出:

5 ,33554432,3 
也即:a[4],0x2000000,a[1+1]

|a[0]    |a[1]    |a[2]    |a[3]    |a[4]    |
|01000000|02000000|03000000|04000000|05000000|
|  |xxxxxxxx|-->P2指向的空间 内部的值为00000002 
 ->0x02000000 = 33554432

数组作为函数参数

编译器将数组变为对应的指针

void f(int a[]); <--> void f(int* a);
void f(int a[5]); <--> void f(int* a);

结论:

一般情况下,当定义的函数中有数组参数时,需要定义另一个参数来标示数组的大小,因为当做指针传输时,会丢失数组大小。

指针和数组的对比

  1. 数组声明时编译器自动分配一片连续的内存空间
  2. 指针声明时只分配用于容纳指针的4字节空间
  3. 在作为函数参数时,数组参数和指针参数等价
  4. 数组名在多数情况可以看做常量指针,其值不能改变
  5. 指针的本质是变量,保存的值被看做内存中的地址
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值