我的C语言是自学的,这些年看过不少教材。 下面,我对其中一些教材做个点评。 1....How to Think Like a Computer Scientist: C version 这是我读过最易懂的C语言教材。...C Primer Plus和C Programming: A Modern Approach 上面这两本,都是著名的C语言初级教材,都是厚厚的大部头。 我通读过它们,感觉都写得不错,都值得推荐。...国产教材 通常来说,国产教材质量不高,不值得推荐。但是有两本,我想特别提一下。 《零基础学C语言》,康莉等著,机械工业出版社,2009。...我现在的C语言,到了这样一个水平:语法已经基本掌握了,可以独立开发一些小程序。下一步,我想进一步提高C语言水平,主要用于Linux开发。 大家能不能推荐一些C语言的中级教材? (完)
我们在指针初阶中介绍了指针的基本概念:如指针大小、野指针问题、指针间的关系运算等,在我们的指针进阶中,将会对指针进行进一步剖析,见识更深的指针!...图片来源:新浪网 ---- 正文 我们将在指针进阶中学习各种各样指针,比如字符指针、数组指针、函数指针等,这些指针种类虽多,但能力都很强大,作为进阶系列文章,涉及知识多多少少有点难度,但我们相信无论多么大的困难都无法阻挡我们的学习之路...,35} }; int sz_str = sizeof(s) / sizeof(s[0]);//结构体型部分 qsort(arr_c, sz_c, sizeof(arr_c[0]), cmp_c);...,从不同类型的指针到回调函数的空指针,我们见识到了属于指针的世界,这个能访问到底层地址小玩意,具有无限潜力,只要指针玩的够六,那么C语言就属于精通级别了。...当然指针进阶还有很多联系等着我们去挑战,我们的目标很简单——征服C指针,然后去实现我们的梦想!
现在网上很多人都吐槽老谭的C语言教材有多少问题,其实有点站着说话不腰疼的意思,现在C语言教材多如牛毛,而且不乏高质量的教材,拿现在的教材和老的教材对比未免缺失公平,在老谭这本教材诞生之初哪有什么教材,当初要解决的是有没有的问题...有多少人是在用老谭的教材学会了编程,然后找到了里面的错误,回过头觉得这个教材太老了,误人子弟之类的话就出来了,这里面还涉及一个问题,大学教材更新速度有点慢的问题,还有一个深刻的问题大学到学习C语言是以理论为主还是以实践为主的问题...当然还有一个问题不能回避,现在大学的教材的更新速度的确有点慢,特别是一些编译环境,都什么年代了还是turbo2.0编译器,里面还是存在一些语法错误,估计这是大家的主要吐槽点。 ?...从另外的层面讲能不能学好C语言和用的什么教材没有直接的关系,关键在于自己的主观因素。自己不去努力或者学不好不要怪教材陈旧或者编译器落后,这总也说不过去。 ?
#include int main(){ char ch = 'a'; char* p = &ch; *p = 'b'; printf("%c",
整型指针数组int* arr[5]; 例如,下面代码int* arr[]是个整型指针数组; int main() { int a = 10; int b = 20; int c...= 30; int d = 40; int* arr[] = { &a,&b,&c,&d }; int i = 0; for (i = 0; i < 4; i++)...指针传参 二级指针传参(以下都可以) void test(char ** p) {} //以下的都可以传上来 int main() { char c = 'b';...char* pc = &c; char** ppc = &pc; char* arr[10]; test(&pc); test(ppc); test(arr...字符数组 (1)char arr[] = { ‘a’,‘b’,‘c’,‘d’,‘e’,‘f’ }; printf("%d\n", strlen(arr)); //随机值,因为不知道\0的位置
main() { //本质上把"kailong"这个字符串的首地址存储在了ps中 char* ps = "kailong"; char arr[] = "kailong"; printf("%c\...C/C++会把常量字符串存储到单独的一个内存区域,当几个指针指向同一个字符串的时候,他们实际会指向同一块内存。但是用相同的常量字符串去初始化不同的数组的时候就会开辟出不同的内存块。...= 30; int * arr[3] = {&a, &b, &c}; 例子2: int a[5] = {1,2,3,4,5}; int b[] = {2,3,4,5,6}; int c[] = {3,4,5,6,7...}; int * arr[3] = {a,b,c}; 模拟了个二维数组,但并不是真正的二维数组。...void test(char **p) { } int main() { char c = 'b'; char*pc = &c; char**ppc = &pc; char
C/C++会把常量字符串存储到单独的一个内存区域, 当几个指针,指向同一个字符串的时候,他们实际会指向同一块内存。但是用相同的常量字符串去初始化不同的数组的时候就会开辟出不同的内存块。...*(*arr)[10] D.char(*)arr[10] 解析: A是二级指针数组,B是指针数组,C是char *数组的指针,D是char *的数组。...只有C是数组指针。 tip:根据优先级看只有C选项优先跟*结合,其他都不是指针,所以直接选C。...( ) A.int (*(*F)(int, int))(int) B.int (*F)(int, int) C.int (*(*F)(int, int)) D....* fun(int *) D.int* (*fun)(int *) 首先C压根就不是函数指针,先排除,然后D返回值不是int,排除,A的参数不是int *,排除,剩下B了。
类型在c语言中为什么有这么多种?因为应用场景不同,解决应用场景应对方式不同,需要空间的大小也不同。 sizeof不仅可以求内置类型,还能够求自定义类型。...char c=0这样写是没有问题的,但是不便于用户理解。...所以c99当中的bool类型可移植性较好。 运行下面这个程序: 我们会发现输出结果是1 2 3。 第一种比较方法不推荐,因为我们会误认为是整数比较。第二种方法也不推荐,false只有C99支持。
C/C++会把常量字符串存储到单独的一个内存区域,当几个指针。指向同一个字符串的时候,他们实际会指向同一块内存。但是用相同的常量字符串去初始化 不同的数组的时候就会开辟出不同的内存块。...(二级指针,指针数组数组名) void test(char **p) { } int main() { char c = 'b'; char*pc = &c; char**ppc = &pc;...//调用0地址处的一个函数 //首先代码中将0强制类型转换为类型为void (*)()的函数指针 //然后去调用0地址处的函数 //( *( void (*)() ) 0 )(); //《C陷阱和缺陷
求的是这个数组的地址; -------->另外一个是sizeof(数组名),这里的数组名是整个数组,求的是数组的大小,单位字节; (2)通过一个例子带你走进数组指针 arr+1就是跳过一个元素,所以相差4C-...48=4个字节; &arr+1就是跳过一个数组,所以相差95C-948=20个字节; 虽然数组的地址和首个元素的地址指向的位置一样,但是他们的类型不一样; 我们引入数组指针就是为了存放数组的地址,数组指针是这样表示的...; 4.数组指针的使用 (1)二维数组的传参实际上传递的是地址 void Print(int(*p)[5], int r, int c) { int i = 0; int j = 0; for (
C/C++会把常量字符串存储到单独的一个内存区域,当几个指针指向同一个字符串的时候,他们实际会指向同一块内存。 但是用相同的常量字符串去初始化不同的数组的时候就会开辟出不同的内存块 。...void test(char **p) { } int main() { char c = 'b'; char*pc = &c; char**ppc = &pc; char* arr[10]...sizeof(arr) / sizeof(arr[0]); i++) { printf("%d ", arr[i]); } printf("\n"); return 0; } 这篇文章详解了C语言中最大的难点指针
使用尖括号包含的是c语言的头文件,包含自定义用双引号。 那么在下面这个函数中,为什么show()函数未定义,程序还是能够运行成功呢? ...但是在text.c的.o文件当中又找到了这个函数。函数的声明本质上也是在内存上开辟空间,只不过变量保存的是数据,而函数保存的是代码,这个代码保存好之后一般是不可被写入的。
一、指针变量 指针变量有字符指针变量,数组指针变量和函数指针变量 1、字符指针变量 char* 叫做字符指针 一般这么来使用:通过指针存储指针后解引用访问 int main() { char c =...'a'; char* p = &c; *p = 'a'; return 0; } 另一种使用方式: 将字符串首字符h的地址放入pstr指针当中 int main() { const char...str4 are same\n"); else printf("str3 and str4 are not same\n"); return 0; } 程序的输出结果是: 官方解释: C/...C++会把常量字符串存储到单独的⼀个内存区域,当几个指针指向同一个字符串的时候,他们实际会指向同一块内存。...; } else { printf("请重新输入\n"); } } while (input); return 0; } 四、typedef 关键字讲解 typedef 是C语言中用来重命名的一个关键字
前言:在编程的浩瀚星空中,指针犹如一颗璀璨的星辰,它不仅照亮了C语言乃至许多其他编程语言的深邃之路,更是衡量一个程序员技能深度与广度的重要标尺。...字符指针 在C语言中,字符指针是一种特殊的指针类型,它用来存储字符(通常是一个字符串的首地址)的地址。...数组指针 在C语言中,数组指针(有时也被称为指向数组的指针)是一个特殊的指针,它指向一个数组的首元素地址,但其类型表明它指向的是一个数组,而不仅仅是一个单独的元素。...总结 在探索C语言指针进阶的旅途中,我们一同跨越了从基础概念到高级应用的广阔天地。...指针,作为C语言乃至许多其他编程语言中不可或缺的利器,其强大与灵活让我们能够深入操作系统的底层,高效管理内存,实现复杂的数据结构和算法。
前言:在C语言的浩瀚宇宙中,指针无疑是那颗最为璀璨而神秘的星辰。它既是连接数据与操作的桥梁,也是让许多初学者望而生畏的迷宫。...一旦掌握了指针的精髓,C语言的世界便仿佛被彻底点亮,编程的效率和灵活性得以质的飞跃。然而,仅仅停留在指针的基本使用上,远不足以探索其全部魅力与力量。...指针的进阶应用,尤其是如何通过指针优化程序性能、解决复杂难题,是每一位C语言开发者必须攀登的高峰 每个实战案例都将配以详细的代码示例与解释,旨在让读者不仅能够理解其背后的原理,更能够亲手实践,将所学知识转化为解决问题的能力...总结 随着指针进阶学习的深入,我们仿佛揭开了C语言世界中最为神秘而又引人入胜的一角。...因此,在享受指针带来的便利与乐趣的同时,我们也必须时刻保持警惕,遵循最佳实践,确保代码的安全与可靠 至此,我们的C语言指针进阶之旅即将画上圆满的句号。但请记住,学习永无止境,技术的海洋浩瀚无垠。
在C语言中,位段(Bit Fields)是一种用来对结构体中的成员进行位级别的控制的特性。通过位段,我们可以灵活地控制结构体中各个成员的位数,从而节省内存空间并提高程序的效率。...本篇博客将详细讲解C语言中位段的相关知识,并提供代码示例帮助理解。 1. 位段的定义 位段是通过在结构体中定义成员时使用冒号(:)来指定成员的位宽的。...希望本篇博客能够帮助读者更好地理解C语言位段的相关知识,并在日常编程中更加灵活地运用这一概念。如果有任何疑问或者需要进一步的解释,请随时留言,我将尽力为您解答。感谢阅读!
目录 指针的进阶 1.字符指针 2.指针数组 3.数组指针 3.1 数组指针的定义 3.2数组指针的使用 4.动态内存分配与指向它的指针变量 4.1 什么是内存的动态分配 4.2怎样建立内存的动态分配...1.用malloc函数开辟动态存储区 2.用calloc 函数开辟动态存储区 3.用realloc函数重新分配动态存储区 4.用free函数释放动态存储区 指针的进阶 本章重点 回顾上一篇博客 c...语言——指针 我们已经先了解了指针的基本概念: 1.指针就是个变量,用来存放地址,地址唯一标识一块内存空间; 2.指针的大小是固定的4/8字(32位平台/64的平台)。...除此之外,C语言还允许建立内存动态分配区域,以存放一些临时用的数据,这些数据不必在程序的声明部分定义,也不必等到函数结束时才释放,而是需要随时开辟,不需要随时释放。
我们先来了解一下什么是递归?递归(recursion):即程序调用自身的一个编程技巧。首先,递归需要满足以下2个条件:
一维数组传参 二维数组传参 一级指针传参 二级指针传参 函数指针 函数指针数组 指向函数指针数组的指针 ---- 前言 对于初阶指针内容在我的另一篇文章中已经写到(有想法的可以去看看) 附上链接:C语言初阶指针...n; int **pp = &p; test(pp); test(&p); return 0; } void test(char **p) { } int main() { char c...= 'b'; char*pc = &c; char**ppc = &pc; char* arr[10]; test(&pc); test(ppc); test(arr);//Ok?
数组名的理解 sizeof 提示:以下是代码样例,下面案例可供参考 char arr[] = "abcdef";//[a b c d e f \0] printf("%d\n", sizeof...数组名的理解(二维数组) 5.1.1 数组名的理解 strlen 特点 ---- 提示:以下是代码样例,下面案例可供参考 int main() { char arr[] = { 'a','b','c'
领取专属 10元无门槛券
手把手带您无忧上云