天可补,海可填,南山可移。 日月既往,不可复追。 ——曾国藩
1、关于整形提升
代码语言:javascript复制char a=101;
int sum=200;
a =27;
sum =a;
printf("%dn",sum);
这段代码的结果是什么呢? 首先关于char,存储的时候是是一个字节,意味着的是最高只能是2的7次方-1。为什么是7次方呢? 因为char是有符号的类型,符号位占了一个字节,也就还剩下127为最高,最小为-128。 此外,127和-128其实是连在一起的,意思是,对于char或者是别的一些有符号的类型也相当于是这样的,从0开始一直加1,能到127,在加上1就会变成-128,然后再加,最后又到0。 所以,a=101加上27,变成的是相当于-128,存储方式是1000 0000作为补码存储再内存中,符号位是1。但是在和int类型的sum进行计算时会整型提升(可以点进去看看,里面有相关介绍),此时由于最高位置是1,所以高位补1,然后再取反 1。为-128,所以sum =a为sum=200-128=72。
2、大小端
关于大小端的判断方法,有两种。 一种是地址的强制转换,反正强制转换的话,会从低地址来取地址。 还有一种方法就是,利用联合体,利用它的存储的特点来判断。 关于细节和实现的操作,这里有,请点击 那么,这样的话,知道了大小端,这题应该会好些点。
代码语言:javascript复制int value = 1024;
char condition = *((char*)(&value));
if(condition) value = 1; condition = *((char*)(&value));
if(condition) value = 1; condition = *((char*)(&value));
printf("%d %d", value, condition);
问:最后的结果是什么? 1024的二进制是:0000 0000 0000 0000 0000 0100 0000 0000 注意: * ((char * )(&value)),这句话的意思是获得value低地址的8为数据,若数据是采用大端存储方式,则低地址对应的是数据的高位,即最左边的8位0,则condition=0,不执行两个if语句,则value不变,还是1024;若数据是采用小端存储方式,则低地址对应的是数据的低位,即最右边的8位0,则 condition=0,不管是大段还是小段,结果都是一样的,都是取全部是0。
3、使用函数时参数的影响
3、1、计算大小(有函数存在)
代码语言:javascript复制void func(char para[100])
{
void *p = malloc(100);
printf("%d, %dn", sizeof(para), sizeof(p));
}
此时,printf的结果是什么呢? 对于char para[100],来说,传到函数中的时候已经发生了改变,传参的时候也只是会传首元素的地址。所以在计算的时候,两个的结果都是4(32位下的指针的大小)。
3、2、计算大小(无函数存在)
在64位操作系统上,下面程序返回结果是?
代码语言:javascript复制int main()
{
int *k[10][30];
printf("%dn", sizeof(k));
return 0;
}
此时的大小不再指的是指针,因为这个结构,是指针数组,那么计算的就是这个数组的大小,然后呢,数组中存储的是指针,再64位上,指针的大小是8个字节,然后这个函数指针,存储了300个指针,所以结果是2400个字节。
3、3、形参和实参
代码语言:javascript复制#include <stdio.h>
void func(char *p) { p = p 1; }
int main()
{
char s[] = {'1', '2', '3', '4'};
func(s);
printf("%c", *s);
return 0;
}
==在调用的时候,创建的只是形参,形参对于原来的实参的拷贝,在函数中的参数,他们的生命周期只会在函数中,离开函数,就会销毁。==所以,p的改变不会对s的指向没有什么影响。这和链表中还是有区别的。
4、关于赋值
若有定义语句: char s[3][10],(*k)[3],*p; 则以下赋值语句错误的是? 1.p = s; 2.p = k; 3.p = s[0]; 4.k = s; 下面哪些是错的? 在没有强制类型转换的情况下,只有类型完全相同的指针才能相互赋值。
char s[3][10]中s运算时会退化为数组指针,类型是char ( * ) [10]。
char ( * k)[3]很明显k就是一个数组指针,类型也为 char (*)[3]
char * p类型为char * 指针
s[0]代表二维数组第一行,此时运算时,会退化成为第一行的首元素的地址。 所欲对于答案来说,答案是124。