引言
🐷如果但凡有用请点赞,因为我看不到活人头,我也算是明白为啥
好多up都说你们的点赞是我最大的动力这句话了。确实点赞才是最大的动力
希望,你们好好学习然后给我点赞!
对于有些极为难以接受的概念,让我学习C语言也很头疼,但是我想把我在学习C语言中对其深层次的思考分享给你们,让你们更加清晰,少走弯路把。第一次写博客,可能有笔误,因为没时间细看,我大致的思路我尽可能表达给你,你看着有些很多,其实大多都是比喻,我用我认为最明白的语言,希望然你理解在那些大佬理解了然后一笔带过的东西把!
1.关于void的小总结
规则一:
当函数参数想要为空时,一般还是用 fun(void)更加的好,这样在编译阶段如果 fun(3)传递参数就会出错,当然定义函数时用fun(), 在实际应用时是可以用fun(3),并且通过编译但是相较前者更好。
void fun1(void){
}
void fun2(){
}
int main(){
fun1(3); //err
fun2(3); //ok
}
规则二:
由于空指针,指向的类型为空因此,在做指针±等运算时,编译器并不知道+±-的实际指针的步长。不过可以通过强制类型转换即可
void* pvoid;
pvoid++;//err
pvoid+=1; /err
(char*)pvoid++;//ok
规则三:
void* 做万能指针!也就是说如果用void* 做函数参数任何指针类型都可以作为实际参数传递给形式参数(也就是定义那里的模板参数)这种方式在系统中十分常用!!因为他的健壮性,由于C语言绝大多数都是在用指针因此万能指针又显得格外重要。
int n=3;
int *pn=&n;
void fun(void* p,int n)
{
*(int*)p=n;
}
int main(){
fun(pn,3);
}
规则四:
不要把void 当作所谓的类型定义变量!如
void a;//err
void * p;//ok
因为void 英语翻译是虚无的,所以他所定义的内存空间是无,所以定义不了变量。为什么void * 可以呢,因为所有只要带上(数据类型)*变量 都是指针变量!!!!,指针类型规定为4个字节 在32,而64位则为8个字节,所以它是可以定义的,所有类型只要可以查到开辟内存的字节数,说明就可以定义变量。就void除外!因此千万不要用void 定义变量,这是很愚蠢的选择啦!
2.关于结构体在内存中的对齐方式
对齐规则
对齐规则 | |
---|---|
以最大类型为对齐单位 | 找到结构体中最大数据类型其中包括在子结构体的最大数据类型比较得出最大的数据类型,比如int、double ,其中double 最大对齐单位为8字节! |
结构体作为成员对齐 | 如果有子结构体,则在子结构体之前和之后都按照 最大类型对齐规则而子结构体的起始内部数据填充起始时按照子结构体最大数据类型对齐,然后依次时后来的数据。 |
注:结构体内部数据的定义先后顺序会影响结构体的大小,因此建议先大后小这样整体相对小一些在很多情况
例题
struct
{
int a;
short b;
}A;
**
1.首先观察其中最大类型:int、short 其中int 为4字节因此
int最大,因此对齐大小应该为4字节!
变量存放方式计算方法
①看定义 先定义a 先放a, a为int 四个字节,放在4*0 的位置,也就是0,因为0没有放东西。就放入4个字节大小的a。
②然后看b,同样的方法,b为short两个字节,将其放在20,但是a已经存放了4个字节,因此改变21,放在第2+1也就是第三个字节位置,发现,还是a的存储位置,那就继续增加2*2,放在第4+1也就是第五个字节位置。此时为空,放入两个字节大小。
a | a | a | a |
---|---|---|---|
b | b | * | * |
从上面可以看到,最终如果放不下了就自动填充不管还有没有数据
综上sizeof(A)为8个字节,其中每个格子代表一个字节
3.数组指针与指针数组
- 简述指针数组和数组指针的区别?
指针数组是数组,用来存放指针类型的数组!
数组指针是指针,是指向数组类型的指针!
其中,其实在C语言看到的复合数组类型如 数组 int a[10] ,异或者是 其他 函数名称等
其实都是可以当作数据类型来看,只不过写的方式不同罢了,其中数组如果这么写会更加
清晰,它是一种数据类型是自定义类型,int [10] a, 这样看是不是更加清晰数组?,其实
数组是一种自定义类型,类似结构体,只不过它的类型决定于两个因素,第一个是数组
存放的数据类型,第二就是数组的维数以及每个维数的个数,这几个因素共同构建了一个
自己定义的数据类型。
2. 如何定义一个指向 int a[10] 类型的指针变量(数组指针)(使用3种方法)?
①typedef int A [10];
A* a;
②typedef int (*A)[10]
A a ;<