char ch = '\077'; // 八进制转义字符
只要是用转义字符来赋值字符变量,不管有没有加单引号,都是表示特殊意义,且表达式都是正确的,都是将其转换成对应的十进制,然后根据ASCII码表来进行赋值
char a[]='\0abc\012345'有几个字节?
\0,我们知道,字符结束符,第一个字节
a、b、c,自然是三个字节
遇到转义字符就难搞了,我咋知道什么时候停止转义,那些是转义字符,哪些又是普通的数字字符?
因为char以ASCII码形式存储字符,我们得先了解ASCII表
first of all,ASCII中的0~31为控制字符;32~126为打印字符;127为Delete(删除)命令
ASCII扩展字符(为了适应更多字符而存在)128~255,或者-128~-1,其中,-128对应128,依次递增对应。
所以,0~255的数字(十进制)就是有意义的(当然,也可以说成-128~255的数字)
我们再来回答这个问题
C 语言标准并不直接支持二进制转义序列,八进制转义序列可以包含最多三个八进制数字,与八进制转义序列不同,十六进制转义序列没有固定的最大数字个数,但通常建议使用两个数字来表示一个字节
八进制最开头的0包含在这个范围之内,所以这个题只能是\012,而不是\0123
所以你可以根据这个要求,在前面补0,来达到只读取并转义一个八位数的目的(极其重要)
同时,最不能忘记的是字符串结束时末尾的字符结束符\0,它必定占一个字节,所以共占9个字节,而不是8个(老六)
int arr[3][3] = {
{1}, // 第一行,只有 arr[0][0] 被初始化为 1,其他元素 arr[0][1] 和 arr[0][2] 被初始化为 0
{2, 2}, // 第二行,arr[1][0] 被初始化为 2,arr[1][1] 被初始化为 2,arr[1][2] 被初始化为 0
{} // 第三行,所有元素 arr[2][0]、arr[2][1] 和 arr[2][2] 被初始化为 0
};
当你声明并初始化一个数组时,如果你只初始化了部分元素,未初始化的元素会被自动设置为零。这适用于静态存储期的数组(例如全局数组和静态局部数组)
正如上面的代码块,花括号里面的内层花括号应该有三个(对应二维数组的“行”),只要你进行了初始化操作,全部数组都会进行初始化
当然,在这里强调的是初始化操作,而不是赋值(如果赋值也是这样,那就太可怕了,haha)
double a[20] 这里a占多少个字节?
void f(double a[20])这里函数f的形参a占多少个字节?
这两个问题出得很好
double
类型通常占用 8 个字节。因此,数组 double a[20]
的内存占用等于元素个数×每个元素的字节数=20×8=160 字节
在 C 语言中,当你将一个数组作为函数参数时,实际上传递的是指向该数组首元素的指针,而不是整个数组
因此,形参 a
在函数 f
中并不占用整个数组的内存,而是占用一个指针的大小
这在32位系统中是4字节(我感觉我学的是基于32位系统的C,haha)
Comments NOTHING