|
一、能力错觉 当书本(或谷歌)摆在眼前时,大脑会产生错觉,以为学习材料也同样存入了大脑,阅读毕竟比回想简单多了。 以为反复的阅读资料就是自己已经掌握知识,这就是能力错觉。 解决能力错觉的方法:
现在网络上盛行各种it类的视频教程,我不否认不少视频教程是高质量的,但是所有视频类资料都有一个问题:
有效的解决办法是:
二、数组和指针有什么区别? 正文目录: 1. 用于声明时两者有重大区别2. 你真的理解声明和定义吗? 3. 数组和指针的底层是如何访问数据的? 4. 哪些场景可以用指针代替数组? 5. 为什么C语言要把数组形参退化为指针? 6. 如何使用指针访问多维数组? 7. 相关面试题 写作目的:
测试环境:
1) 误导新手的说法: 由于数组和指针的所谓等价性非常接近,不少程序员有时忽视了二者之间的其他重要区别 ,最误导新手的说法之一就是 “数组和指针是相同的",这是一种非常危险的说法。 看下面这个例子: extern int *x;extern int x[];
2) 为什么有些人会误以为指针和数组总是可以互换? 最主要原因是:
2. 你真的理解声明和定义吗? 想要要真正理解为什么 extern int *x 不等于 extern int x[],我们首先需要搞清楚什么是声明,什么是定义。 1) 链接器的视角:
2) 定义和声明的联系与区别:
3) 总结成一句话:
4) 回过头来看这个例子: extern int *x;extern int x[]; 前者声明了一个指针,后者声明了一个数组,那么它们对应的指针和数组的定义(最重要的是内存分配) 能相等吗? 3. 数组和指针的底层是如何访问数据的? 现在我们来看看指针和数组的定义与使用。 1) "地址 X (Address)" 和 "地址 X 的内容(Contents of Address)" 之间的区别: 对于"地址 X" 和 "地址 X 的内容",在 C 语言中是用同一个符号来表示这两样东西,由编译器根据上下文环境判断它的具体含义。 2) 看下面这个例子: X = Y
3) 数组和指针的访问方式是不同的: char a[9] = "abcedefgh";
char *p = &c;
4) 当定义为指针 (char *p),并以数组方式 (p) 引用时会发生什么? char *p = ”abcdefgh”printf("%c\n", p[3]); char *a = ”abcdefgh” printf("%c\n", a[3]);
4. 哪些场景可以用指针代替数组? 数组和指针容易混淆使用的 2 大类场景:
1) 声明:
extern char a[]; // ok extern char *a; // error
2) 在表达式中使用:
3) 几条重要的规则:
5. 为什么 C 语言要把数组形参退化为指针?1) 出于效率的考虑:
2) 出于简化编译器的考虑:
3) 看下面这个例子: static int array[10], array2[10];static void func1(int *ptr) { ptr[1] = 3; *ptr = 3; ptr = array2; } static void func2(int array[]) { array[1] = 3; *array = 3; array = array2; // OK, because array is a pointer printf("*array=%d\n", *array); } int main(void) { func1(array); func2(array); array[1] = 3; *array = 3; array = array2; // ERROR return 0; } 编译运行: // main 中调用 array = array2时:11: error: assignment to expression with array type // 去掉 main / array = array2时: $ ./point_array_arg *array=0 6. 如何使用指针访问多维数组? 1) C 语言的多维数组:
7. 相关面试题 1) 找错:计算字符串长度 下面这段程序是为了把字符串转换为大写: #include <stdio.h>void UpperCase(char str[]) { int test = sizeof(str); int test2 = sizeof(str[0]); for(size_t i=0; i<sizeof(str)/sizeof(str[0]); ++i) { if('a'<=str && str<='z') str -= ('a'-'A'); } } int main(void) { char str[] = "aBcDeefGHijKL"; printf("The length of str is %d\n", sizeof(str)/sizeof(str[0])); UpperCase(str); printf("result: %s\n", str); return 0; } 运行结果: $ ./sizeof_arrayThe length of str is 14 result: ABCDEEFGHijKL 问题出在 UpperCase() 里的 sizeof(str),这里的 str 是一个指针而不是数组。 正确的写法有2种:
|
微信公众号
手机版