C语言复习之路(指针,数组)14/15号一起了

数组、指针

一、数组与指针(个人认为)

什么是数组?
我认为:
数组就是一个容器,用来存放各种类型的数据。
书上说

什么是指针?
我认为:
指针也是一种变量类型,只不过它存放的数据是地址,而我们正好可以通过这个地址去找到这个地址所对应的内存空间。通过*号,可以改变那块空间中的值。
书上说:

数组和指针有什么关系?
我认为:
由于数组可以存放各种类型的数据,因此也能存放指针。(指针数组)
指针中存放的是地址,因此也能存放数组的指针。(数组指针)
书上说:

二、指针

说到指针,就一定要先了解下*的作用
1、*的用法
看作一把钥匙,去解锁指针指向空间中的内容。
区分int *p =NULL 与 *p = NULL
前者是初始化定义一个指针指向空,后者是赋值,将p指向空间的内容赋值成0;
大部分系统NULL被宏定义成0:#define NULL 0。(扩充:NUL与NULL不同,前者是ASCII码中的第一个数,也就是空字符)
注意:在将地址0x12ff7c这块地址赋值给指针时,一定要强制类型转换成指针类型
指针只能改变变量的值,常量无法改变

三、数组

在这里插入图片描述1、Sizeof(a[5])结果为5,为什么没有出错。
由于sizeof是一个关键字并不是函数,在使用的时候是根据数组存放的类型来确定值的,并没有真正的去访问。
2、
Sizeof(&a[0])
Sizeof(&a)
前者是数组a首个元素地址的大小,32位系统是4,64位系统是8
后者是求数组a的首地址地址大小,32位系统是4,64位系统是8
在这里插入图片描述3、数组名a出现在赋值符号左边和右边的区别
出现在左边:
a不能作为左值:我们只能访问元素,而a是一个整体不能。
出现在右边:
指的是数组首个元素的地址.
但是编译器没有为数组名a开辟一个空间存放地址,而指针是有空间的。

四、指针与数组的恩恩怨怨

1、指针是指针,在32位系统永远占4个字节,其值是某一个内存的地址。
指针可以指向任何地方,但不是任何地方都能通过指针访问到呢?
数组就是数组,他的大小与元素的类型和个数有关,定义数组的时候必须说明数组的个数与元素类型。
2、*(p+4)与a【4】;本质是没有区别的
前者:把p指针加上4个字符的偏移量,让后取出此地址的内容 (匿名访问)
后者,也可以解读为先取出p存储的地址,再将地址加4个字节的偏移量,记录新的地址,取出新地址的内容。 ( 具名+访问)
3、3、定义为数组,声明为指针(错误的)
在文件a中定义char a【100】
在文件b中声明extern char *a
在文件b中a只是声明为一个char类型的指针,在对其操作的时候是以指针的所占空间来取a的内容的地址当中地址,编译器一次性取出前4个字节的值当做地址,但这个并不是有效的地址。
在这里插入图片描述
4、定义为指针,声明为数组
在文件a中定义char *p
在文件b中声明extern char p[]
在b文件中,p是一个数组,元素类型为char,因此就将a文件中的指针存放的地址4个字节,拆成4个1个字节的地址分别当做4个元素的地址
在这里插入图片描述

牛客网

1、
在这里插入图片描述优先级顺序:移位大于异或大于赋值。
2、
在这里插入图片描述
在这里插入图片描述0表示八进制
3、
16位系统没有内存对齐因此是12,下面有在64位系统下的测试,结果是20
在这里插入图片描述在这里插入图片描述64位系统测试
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值