函数传值引用时形参是使用实参的拷贝,在函数中对形参进行操作不会改变实参的值,如果想要改变实参的值,则需要传址引用,然后通过解引用访问实参。
此外当全局变量和局部变量名字重合时,局部变量优先。
回忆一下两个进制转义字符的含义:
\ddd 三个八进制数字 \xhh 两个十六进制数字
然后可以看看这道题。
下列是指针变量的事(多选)
要记住#define 的定义是“替换”,而typedef是类型改名。
那么第三行就是 int* a,b; 第四行就是int*c,int *d; 因此a,c,d是指针;
这道题答案是8,如果能做对那么我相信你对于 替换 应该已经理解得很深刻了。
在这里,c和&c的值相同,因此效果相同,但是b必须取地址。
静态局部变量在函数结束时并不会销毁,生命周期比函数长,但作用域仍然是在函数里面
const 和 * 的左右关系:左定值,右定向。意思就是说如果const在*左边,那么指针指向的变量的值不能通过指针改变,如果在右边,那么指针的指向是不可改变的。
提示:f既定值又定向。
B:double类型是浮点型,会有误差,判断其是否为零通常是判断是否小于某个精确度的很小的值
C:左边可以正常初始化,对于右边,在声明了char a[14]之后,a代表首元素的地址,是一个常量,不能修改。
通常数组名的值都是首元素地址,除了两种特殊情况:
1.sizeof(数组名),此时结果是整个数组的字节数。如果是作为参数传给函数的话那么只是一个指针变量。
2.取地址&后加数组名,可以验证,如果定义arr[10],&arr[0]+1与&arr[0]相差4个字节;而&arr+1与&arr相差40个字节。
A:没有考虑内存对齐。
结构体的大小计算遵循结构体的对齐规则:
1.第一个成员在与结构体变量偏移量为0的地址处。(即结构体的首地址处,即对齐到0处)
2.其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。
3.结构体的总大小为最大对齐数(每个成员变量都有一个对齐数)的整数倍。
4.如果嵌套了结构体,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍。
对齐数 = 该结构体成员变量自身的大小与编译器默认的一个对齐数的较小值。
注:VS中的默认对齐数为8,不是所有编译器都有默认对齐数,当编译器没有默认对齐数的时候,成员变量的大小就是该成员的对齐数。
以上截图来源于CSDN博主「2021dragon」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/chenlong_cxy/article/details/114332324
这道题考察循环语句的控制变量在其他地方被改变造成的影响。
先算a-=a*a;再算a+=左边算出来的值,。
n+(n-1)+...+1=n*(n+1)/2
printf的返回值是它打印字符的个数,在此为1,而‘0’也不是0,因此这俩等价(都为真)
考察对ASCII表的熟悉,一些常见的:A 65,a 97,‘0’ 48
跳出多层循环的几个方法
这里||的优先级更高,循环判断条件是(i||i++)<5.打死你||有一个特性:在左边表达式为真的时候会不执行右边的程序
函数不写返回值类型默认为int
注意这个print是自定义的函数。
一维数组定义时必须写长度,C中如果换成‘0’就是48,那么可以,另外此处不考虑变长数组
a[x]就是*(a+x),x[a]和a[x]一样,那么X[i][j]就是*(X[i]+j)那就是*(*(X+i)+j).B选项中,[]的优先级高于*,因此B和**(X+i+j)等价
十六进制运算,X[9][9]-X[4][4]是5n+5;X[9][9]-X[7][7]是3n+3
有符号位数右移是补符号位的
比如下面这道题
数据类型转换
从高到低的顺序:char int long float double
特别地,int 与 unsigned int 比较大小的时候,int 会转换成 unsigned int.因此当int为负数(符号位为1时)需要特别注意这个是一个很大的数
在判断时不能用连续的大于或者小于号在这里‘0’<=c不成立,为0,然后再判断0<='9,成立,因此是打印YES
x赋值给y时会整型提升为int,高位补0,因此选b
unsigned char 数据类型范围是0-255,因此是死循环
int fun(char *s)
{
char *t=s;
while(*t++);
return t-s;
}
//输出什么?是strlen还是sizeof?