声明和定义
1.在C语言中函数可以嵌套调用,但不可以嵌套定义2.传值调用与传址调用,传值:形参是实参的临时拷贝,修改形参不会改变实参。传址:形参按照指针方式传递,将来形参就是实参地址的一份拷贝,形参指向的是实参,修改形参指针指向的内容, 就是在操作实参。
3.形参与实参可以同名,因为两者在不同作用域中。
4.递归会造成栈溢出。因为每次递归,相当于都是一次新的函数调用,而每次函数调用系统必须给该函数划分栈帧空间,内部的递归函数没有退出,上层的递归就不能退
出,栈帧就会累积许多块.
5.int arr[] = {1,2,(3,4),5} 的实际形式为.int arr[] = {1,2,,4,5}。(3,4)取逗号后面的值。
6.sizeof(str)与strlen(str), sizeof的计算包含\o, strlen的计算不包含\0
算数转换
1.野指针指向的空间时非法的,或者说该指针指向的空间已经不存在了,因此野指针不能使用。(指向位置不确定的指针被称为野指针)
2. 32位系统下: int占4个字节,指针表示地址空间个数,总共有2^32个,故占4个字节
64位系统下: int占4个字节,指针表示地址空间个数,总共有2^64个,故占8个字节
3.i 没有初始化,默认值为0;i--值为-1, 但由于sizeof()为无符号整型所以将i强制转换为无符号整形。所以输出为“>”。
#include <stdio.h>
int i;
int main()
{
i--;
if (i > sizeof(i)) // 因为sizeof 为无符号整型 所以强制转换i
{
printf(">\n");
}
else
{
printf("<\n");
}
return 0;
}
指针类型
1 *(p+i), 指针类型 int 每次加四个字节 short 2个字节 依次类推 (i代表变量累加数)
unsigned long pulArray[] = {6,7,8,9,10}; // 无符号长整形数组
unsigned long *pulPtr; // 无符号长整形数组 占用4个字节空间
pulPtr = pulArray; // 取首地址
*(pulPtr + 3) += 3; // 第三个元素加3为12 原数组变为 {6,7,8,12,10}
printf("%d,%d\n",*pulPtr, *(pulPtr + 3)); // 打印第一个元素 与第三个元素 故输出为 6 与12
2 两个指针相减,指针必须指向一段连续空间,减完之后的结构代表两个指针之间相差元素的个数
指针中存储的是地址,地址可以看成一个数据,因此可以比较大小。
3 指针数组与数组指针的概念 (看最后两个字,若为指针则为指针, 若为数组则为数组)
指针数组 数组中的每个元素都是指针 int* arr[10]; 数组指针 指向数组的指针 int (*arr)[10];
4 存储地址与强制转换: 地址存储的规则是 从右往左开始存储
#include <stdio.h>
int main()
{
int a = 0x11223344; //0x64| 44 | 0x65| 33 | 0x66| 22 | 0x67| 11 |
char *pc = (char*)&a;
*pc = 0;
printf("%x\n", a);
return 0;
}