指针及数组作业【1】

1.sizeof()在c语言中 是一个判断数据类型大小的运算符(如果sizeof中有表达式的话,则sizeof会计算输出结果的表达式的大小)

sizeof 的括号内只能有一个操作数,所以出现 ( a , b )这种多个操作数的情况是不被允许的

能够被允许放进sizeof中的只有整体,如一个变量或者一个表达式,其中出现表达式时,表达式的输出结果才是真正的操作数

sizeof输出的结果是 1.无符号整型 2.操作数的类型所占内存空间的大小

2.数组名只有在单独放在sizeof中时才表示整个数组,此时sizeof计算的是数组类型大小

如果数组名不是单独呆在sizeof中的话,则此时数组名表示的是首元素的地址

3.地址被默认为指针类型,其大小只有4(32位机)/ 8(64位机)单位是字节

sizeof和strlen


在算术运算中出现short和char时,它们都会在被整型提升之后在进行运算,并且计算出的结果会被默认为整型

不同的指针类型带来的是步长大小的差异

不同的指针类型有着不同的步长大小,不同的步长大小决定你的地址+1个步长会加多少

strlen函数是用来计算字符串长度的(字符个数),其计算的起点是第一个字符,计算的终点是\0终止符(\0本身不计数),

字符串常量和字符常量最大的区别就是字符串常量都会自带一个终止符 \0,而字符常量是不需要的

以及字符常量是‘单引号’,字符串常量是“双引号”,

双引号中默认自带一个隐而不发的\0终止符,而单引号中则没有

计算机在打印字符常量的时候不需要以\0为打印终点,而是直接打印一个字符后自动结束

而在打印字符串常量的时候则需要\0作为打印终点,否则的话计算机会在打印双引号中非\0的字符后,打印随机值(在ascii码表的范围内随机),直到随机到\0终止

plus: strlen函数的返回值也是unsigned int  . 另外int 类型在与unsigned int 进行算术运算的时候会先被强制类型转换为unsigend int 后再进行算术运算并输出结果,且结果的类型默认为 unsigend int

int strlen(const char * const s)
{
int i;
for (i = 0; s[i]; i++) ;
return i;
}

上面这个是strlen函数的源码
首先要传的参数是地址或者字符指针
其次在遇到\0时终止,没有遇到\0的话就继续往下计数
补充:\0的ascii码值是0,并且\0终止符也被认为是NULL符,而字符'0'的ascii码值是48

注意:在if,while,for ,do while 等等循环判断中,判断的依据都是被判断对象存到计算机中二进制码,如果码 == 0 则认为是假,不进入对应操作 ,否则认为是真,进入对应操作。

在访问和操作一个地址前,我们一定要直到它的指针类型是什么,因为我们是站在它的类型的角度上来操作和看待地址的(或者说指针类型决定了步长的大小,而步长的大小决定了我们对地址进行操作时的结果是什么。)

地址由什么指针来接收就从什么指针的角度来看待和操作这个地址

下标引用操作符的本质是将两个操作数相加之后解引用


计算机所有判断和操作的依据都是存储在它的计算机中的二进制码

对于数组地址而言,舍其首元素的地址(数组名)为 a ,&转义得数组首元素的值 &a 

注意:这两者有着 a = *(&a)的特殊关系!!! --- 数组地址解引用之后得到的是数组首元素的地址

 下标引用操作符的嵌套使用

上面这个的本质是:

1.第一层下标引用操作符的使用 : *( a[0] + i )

2.第二层下标引用操作符的使用:  *( *( a + 0 ) + i )

嵌套调用的顺序是从右往左依次调用下标引用操作符,且在调用一个下标引用操作符的时候,该操作符的左边部分看作一个操作数整体,括号里又是一个操作数整体,然后根据下标引用操作符的本质(两个操作数相加之后解引用)来使用下标引用操作符。


sizeof的特殊情况 : 当sizeof的括号内单独放的是数组首元素的地址的时候,我们认为sizeof此时计算的是整个数组的大小,其它的时候我们都认为sizeof计算的是变量/表达式/地址(非数组首元素)等对应类型的大小

一个表达式具有两种属性:

1. 值属性 --- 需要我们去切实计算,存数据,反问得到的结果

2. 类型属性  --- 不需要进行计算,访问,创建数据就可以得出的最终结果的类型

当数组名(数组首元素的地址)单独放在sizeof中时,我们认为此时在sizeof中的类型是数组名对应的数组类型 

数组中元素的类型 [ 数组中的元素个数 ]  --- 这个类型的大小是数组中元素的个数 * 数组中元素的类型的大小

如上面的 a[3][4]

当我们有sizeof ( a[4] ) 的时候 ,尽管我们越界访问了,但是我们仍能够得到16这个返回值

为什么呢?

因为sizeof中只考虑类型属性而不考录值属性(也就意味着我们不需要去计算去存数据),所以我们并不需要去越界访问和建立一个第四行数组我们只需要知道如果要建立第四行数组,它的数组类型是啥就可以给出返回值了

sizeof不会造成越界,因为我们根本就没有访问和建立一个越界的数组(不考虑值属性) 

无论括号里是上面,sizeof计算的都是类型的大小!!!

比如这里面 ,由于sizeof只考虑类型属性不考虑值属性,所以sizeof中的表达式不会进行运算,但我们可以得知运算后得到的结果的类型,而我们的sizeof可以计算这个类型的大小并返回数值

只考虑类型属性而不考虑指属性可以让我们在不去计算,创建,访问,操作一个数据并得到结果的的同时依然获得这个数据在被创建,访问,操作,计算后的结果的类型


 跨过一个数组之后得到的是屁股后面紧挨着的内存空间的地址

ps:一个内存空间由多个/一个内存单元复合而成,这个内存空间的地址与从左往右排第一个内存内存单元的地址相同(一个内存单元的大小是一个字节)

数组指针的步长的大小是数组的大小 ,数组指针+1,则跨过整个数组直接将指针指向紧挨数组屁股后面的内存空间

一个字节的大小是八个bit位!!

地址0x100000 和 0x100001之间差了一个字节

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值