C基础知识复习(上)

C基础思维导图(上)

C思维导图(下)

如上两张是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的使用方法,以及自己编码实现其功能

有关冒泡,递归,折半,穷举等算法可参阅博文:


  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值