笔记所有内容参考《东大红皮书》,由本人后期整理在加工。

  • 指针p指向了数组a,请写出至少3种数组a第i个元素的方式。
1. a[i - 1] 2. p[i - 1] 3. *(a + i - 1) 4. *(p + i - 1)
  • 如果想通过一个函数获得多个返回值,请写出至少2种实现方法。
//1. 变量地址方式
void func(int* a, int* b) {
    *a = 1;
    *b = 2;
}

//2. 全局变量方式
int a, b;
void func() {
    a = 1;
    b = 2;
}
  • 举例说明结构体和联合体的区别。
/*
在结构体中各成员有各自的内存空间,一个结构体变量的长度大于等于各成员长度之和;
而在联合体中,各成员共享一段内存空间,一个联合体的长度等于各成员中最长的长度。
结构体st占8个字节,而联合体un占4个字节。
*/
struct st {
    char c;
    int i;
};

union un {
    char c;
    int i;
};
  • 举例说明define与typedef的区别。
/*
1. define是一种宏定义,而typedef是一种类型定义;
2. define是在预编译时进行简单的替换,不做正确性检查,而typedef是在编译期间进行类型定义,编译器会做正确性检查。
*/
#define INT int
typedef int INT;
  • 写出2种判断字符串结束的方法。
//1. c风格字符串方式,字符串最后一个字符为'\0'
while(str[i] != '\0'){ ++i; }

//2. 字符串长度方式。
for(i = 0; i < strlen(str); ++i) {}
  • 当函数的形参为数组时,请写出对应的2种实参形式。
//1. 形参为一维数组
void func(int array[], int length);
int a[2];
int* a;

//2. 形参为一维指针数组
void func(int* array[], int length);
int* a[2];
int** a;

//3. 形参为二维数组
void func(int array[][3], int length);
int a[2][3];
int (*a)[3];
  • 当函数的形参为指针时,请写出对应的2种实参形式。
//1. 实参为变量
int i;
func(&i);

//2. 实参为指针
int* p;
func(p);
  • 函数声明的作用,在什么情况下自定义函数不需要函数声明。
/*
1. 提前告知编译系统,函数的名字、参数类型、参数个数、参数顺序和返回值类型等信息,
以便在调用该函数时系统按此进行检查;
2. 自定义函数定义写在调用该函数的语句之前。
*/
  • 简要说明while和do-while语句的异同。
while(cond){}
do{}while(cond);
/*
相同点:循环判断条件相同,cond非0为真,是0为假;
不同点:while先判断再执行,do-while先执行再判断。
*/
  • 简要说明static局部变量和自动变量,全局变量的异同。
/*
1. static局部变量分配在静态存储区,在程序的整个运行期间内都不释放空间;
    而自动变量分配在栈区,在离开作用域时,自动释放;
2. static局部变量是在编译时赋初始值,并且只赋一次初值,默认为0,在以后每次调用函数时,都不再重新为其赋值;
    而自动变量的初值不是在编译时赋予的,默认为随机值,每次调用函数时,重新申请空间重新赋值。
3. 可以被文本文件中其他函数所共用。
*/
  • 简要说明定义int* p[4]与int (*p)[4]的区别。
/*
int* p[4]是一个长度为4的一维数组,数组成员为int*;
int (*p)[4]是一个指针,指向一个长度为4的一维数组,数组成员为int。
*/
  • 简要说明break和continue的异同。
/*
相同点:都可以作用于循环体内,在同一语句块内之后的语句不能执行;
不同点:break跳出一层循环体,continue跳过本次循环。
*/
  • 基本数据类型的说明符有哪些,可以进行哪些运算。
/*
int char float double;可以进行算术运算(加减乘除),关系运算(大于小于等于不等于),逻辑运算(与或非),赋值运算。
*/ 
  • 函数参数压栈顺序默认从右到左,即从左往右算。
func(int x, int y, int z){
    printf("%d %d %d", x, y, z);
}

int a = 1;
func(++a, ++a, ++a); //2 3 4
  • c语言的左结合与右结合。
    • 左结合:从左到右算
    • 右结合:从右到左算
  • -> 比++、--优先度高:
    • p++->n,先取n,再++
    • ++p->n, 同理
  • ++、--比+、-、*、%优先度高
  • x = x + 1; 等价于 x = (x+1);
  • p = &&i,错误,因为&i之后,已经变成字面值,不能再取地址
    • i = *&j这样是可以的。
  • 标识符只能由字母、数字、下滑线组成,字首只能是字母、下划线
    • $符号也可以作为标识符,字首也可以
  • 大端小端
    • 大端:内存地址低位存放数字高位,普遍网络传输,减少丢失精度
    • 小端:内存地址低位存放数字低位,普遍内存运算,先算内存低位
  • &&和||的短路运算原则。
  • 'A' = 65, 'a' = 97
  • 整型向下取整 8/3 = 2
02-12 07:15