作为一个Android开发者如果想阅读源码只会Java语言是不够的,由于工作的原因要求去了解源码的一些逻辑,发现在看书和阅读源码的过程中不懂C语言真的寸步难行,只靠Java的那点基础去理解C语言的语法很费劲,所以在工作的间隙去学习C语言,目的不是能够写出多牛的C代码,只是能够看得懂别人的C代码,知道每段代码的意思。下面从第二章开始记录我读《HeadFirst C》的笔记。
指针
指针即数据存放的地址值,指针变量接收的就是地址值
指针的使用方法:
&x 表示变量x的地址值
int* 是一个指针数据类型,表示一个存放整型变量的地址值数据类型
*y 表示地址y上存放的数据
如下:
int x = 5;
int* m = &x; //m就是一个指针变量,接收x的地址值
x = *m; //获取x地址值上存放的变量
注意:
1:指针的长度只和操作系统的位数有关,32位的操作系统指针长度为4,64位操作系统的指针长度为8
2:当数组被当做形式参数传递的时候,数组可以被用来当做指针来处理,它指向数组的第一个地址位置
指针和数组的区别:
1:使用sizeof不同,指针变量的长度只有4和8,但是使用sizeof(数组),返回的是数组的长度
2:数组变量的地址就是它本身,指针变量的地址不是它本身。如下:
char s[] = "How big is it"; //变量s是数组变量
char* t = s; //变量t是指针变量
其中&s==s ,但是 &t != t ;
3:数组变量不能指向其他地方。
创建指针变量的时候,计算机会为它分配4或8个字节的存储空间,但是创建数组的时候计算机不会为数组变量分配任何空间,编译器仅在出现它的地方把它替换成数组的实际地址,所以不能把数组变量指向其他地方。
上面的例子 s = t ,将t 赋值给 s 会报错
输入
C语言中输入主要用到两个函数scanf
和fgets
scanf函数
1:使用方式:
char name[5];
printf("Enter your name:");
scanf("%4s",name);
printf("name: %s\n",name);
scanf接收一个char指针,上面的代码要求总共会读取4个字符,加上字符串结束符\0,一共5个所以字符数组的长度定义为5,如果用户输入大于4个字符,也只会显示4个字符
2:scanf的弊端:
使用这个函数的时候一定要严格限制用户输入的字符数,一旦输入的过多就会导致缓冲区溢出,所以scanf的第一个参数我们一般会控制字符数而不是直接使用%s,但是并不是什么时候输入的字符多了都会报错的,即使这样我们也要控制
fgets 函数
1:使用方式:
fgets() 这个函数和scanf() 一样也是接收char指针,但是在使用它的时候你必须给出最大长度·,fgets的返回值是char* 类型,是用户输入的字符串。
char food[5];
printf("your food:");
fgets(food,sizeof(food),stdin); //sizeof设置了最大长度,stdin表示数据来自键盘
printf("you enter is %s\n",food);
2:使用注意:
这里food是一个数组所以可以使用sizeof来获取长度,当food是一个指针的时候就不能使用sizeof了,因为指针的长度是固定的,此时需要显式的给出具体长度
fgets的长度已经算上了结束符\0,所以上面的例子food中也只能接受4个字符
scanf函数和fgets 函数的区别
1:使用方式不同。都接收一个字符数组,但是scanf是手动限制用户输入的字符个数,fgets是通过参数的形式限制
//scanf的使用
char name[5];
printf("Enter your name:");
scanf("%4s",name); //在这里手动限制用户,只能输入4个字符,因为一共就接收5个
printf("name: %s\n",name);
//fget的使用
char food[5];
printf("your food:");
fgets(food,sizeof(food),stdin); //在这里通过参数sizeof 来限制输入的字符数,也是只能输入4个
printf("you enter is %s\n",food);
2:返回值不同。scanf 返回值是用户输入的数据条数,int类型;fgets 返回值是用户每次输入的数据,字符串类型
输出
C语言中输出到控制台主要使用 puts 和 printf 函数
二者的区别:这两个函数都是用来打印字符串的,区别是puts输入完之后会自动换行,printf不会自动换行,需要手动加上\n
C语言中的字符串
在C语言中是没有字符串这个变量的,C语言中字符数组就相当于java中的字符串,使用流程如下:
1:导入C标准库 <string.h>
2:对字符串的操作方法:
int strchr(char* original_str , char* target_str )
: 在字符串中查找字符,返回正表示找到,负数表示没有
int strcmp(char* a,char* b)
: 比较字符串,比较字符串在字母表中的前后顺序,返回int值。正:升序;负:降序
strcpy()
: 复制字符串
strlen()
: 返回字符串的长度
strcat()
: 连接字符串
strerror(errno)
: 这个函数会显示exec()函数运行过程中出现的错误
网友评论