如上两张是C语言基础的思维导图:从上图看了C语言基础知识包括如下:
I/O 函数: 需要掌握各种输入输出函数(printf | scanf | getchar | putchar | puts | gets),以及printf中所用到的格式控制符和对齐输出 (%5d 等等)
语法:和其他语言一样必须要掌握其语法,如判断 循环 条件 选择 continue break goto 等等辅助语句的用法
函数:相当于其他高级语言中的方法,有自己写的函数和库函数,使用库函数时需要导入头文件以及库的加载路径,其他语言使用系统函数时也是要导入命名空间的
数组:掌握数据的本质,定义,在内存中的存储布局,数组两中访问数据的方式,数组之间的赋值(不能使用赋值运算符),数组的大小(实参数组的大小和形参数组的大小不一样的,需要注意,用sizeof测试)
字符串数组:掌握字符串的定义,字符串数组和字符串指针的区别,字符串指针所指向的地址如何在内存中分配,字符串的一些操作函数
如上总结的知识点是上部分,主要看标红的难点。
1.变量存储分配
上图是变量存储分配示意图,从图中可以看出,内存是有分存储区域的,不同的变量存储在内存中的区域不一样
kernel 内核区, 该区域由系统占用 不可读写
环境变量命令参数,存储环境变量等数据,可读不应该写
栈 可读可写 一般变量都存在栈中
共享库/动态链接库 可读不可写
堆 可以读写
BSS区 存储未初始化的全局变量或static修饰的未初始化变量 该区域中存储的变量默认初始值为0
Data区 存储以初始化的全局变量或static修饰的以初始化变量
Ro.data只读区 存储一些常量 如:3 5 “hello”等这些
text区 存储代码片段
(
需要注意的是: const int a 是存在栈上的 并不是只读区 const只是给编译器看的 在编译的时候 如果许改其a的值就会出错)
2.字符串数组和字符串指针的区别
看完变量在内存中的存储分配,那么我们可以根据上图进行分析字符串数组和指针之间的差异了。
2.1指针自加误区
#include <stdio.h>
int main(void)
{
char *p="beautiful";
printf("%c\n",*p);
getchar();
return 0;
}
如上代码:
一个字符串指针指向一段字符串,输出指针所指向字符串的值,b
那么,看看如下几种情况的输出结果:
p: 输出 beautiful
*p++: 输出 b 然后在 p=p+1; 此时p指向了字符e
*++p: 先执行自加在输出 p=p+1; 在输出 得到e
++(*p) 这段语句是错误的 解析: 首先拿到*p 是b 然后 b的ascall码是98 在对98自加 98是常量 自加分拆 98=98+1 这是错误的语句
(*p)++ 和++(*p)一样是错误的
2.2 数组和指针的区别
2.2.1 误区1
#include <stdio.h>
#include <stdlib.h>
int main()
{
/*char str[]="hello";
str[0]='H';
printf("%s\n",str);*/
char *str="hello";
*str='H';
printf("%s\n",str);
system("pause");
return 0;
}
原因:使用数组的话,str在栈上分配了一块连续的存储空间,栈是可读可写的,所以str[0]修改是可以的, 而 使用指针的话str在栈上分配了4字节的存储空间用了保存hello的地址,hello确是分配在只读区中,是不可以修改的
2.2.2 误区2
#include <stdio.h>
#include <stdlib.h>
int main()
{
char str[]="hello";
while (*str!='\0')
{
putchar(*str++);
}
char *str="hello";
while (*str!='\0')
{
putchar(*str++);
}
system("pause");
return 0;
}
上续代码,用指针没问题,用数组就出错
原因:
使用指针时,str在栈上占4个字节,用了存hello的地址,hello在只读区。最后*str++ 分拆其实就是*str 然后在str=str+1; str在此是指针变量 变量是可以改变值得
使用数组时,str在栈上占一段连续的存储空间, 分拆其实就是*str 然后在str=str+1; str在此代表数组的首地址 地址是常量 不能str++
2.2.3 误区3
#include <stdio.h>
#include <stdlib.h>
int main()
{
char str[5];
str="nice";
char *str;
str="nice";
system("pause");
return 0;
}
原因:
用数组时,str 是数组的首地址,属于常量 不能修改, 再者 nice可以看做是一个数组,数组之间不可以用=赋值的 可以用strcpy函数
用指针时,str存储了nice的首地址 str是变量 这是允许的
在此,上阶段的知识差不多巩固完了,还有一些字符串操作相关的函数可以参阅
当中,介绍了strlen,strcpy,strcmp,strcat,strchr,strstr,strtok的使用方法,以及自己编码实现其功能
有关冒泡,递归,折半,穷举等算法可参阅博文: