C语言学习重点的知识点:
1. 关键字:函数的,字符串的等部分常见的关键字;
2. 字符串的拷贝,数组和指针实现;和内存有关;
3. 对内存的操作;计算内存地址;
4. 算法必须熟练;
C基础
1. 变量的类型和大小
char, float ,int ,long, short等字节长度;
char: 1个字节
float:4个字节
int: 4个字节
short:2个字节
Long: 4个字节
long long:8个字节
double: 8个字节
char a[10]:10个字节
int a[10]:40个字节
float a[10]:40个字节
2. 指针的字节大小
char *ptr1; sizeof(ptr1) = 4;
int *ptr2; sizeof(ptr2) = 4
float *ptr3; sizeof(ptr3) = 4
指针存放的是地址值,地址是四个字节,地址指向的空间大小另算
void *p =malloc(100); 仅仅表示p可以转换成char *,int* 等,是没有void *的;
3.C的数据类型:
a. int ,char .float
b. struct ,数组,enum, union;
c. 指针;
d void 类型;
3 常量,变量;
unsigned int a; (0~ 2^32 -1);
int; -2^31~2^31-1
unsigned int ; 0~2^32-1;
short ; -32768~32767
unsigned short: 0~2^16-1;
4.整型数据的溢出
unsigned short a = 65535;
unsigned short b = a +1;
那么.b= 0;
如果是有符号数:
short a = 32767;
short b = a +1;
那么.b=-32768;
正向整型数益处以后,从最小开始,无符号从0开始,有符号从负的最小值开始;
反向溢出时,从正的最大值开始;
5. 字符变量
1)单引号‘’表示字符,双引号" "表示字符串;
2)字符变量只占一个字节;
6.stcpy的使用
char c1 ,c2[10];
c1 = 'a';
c2 ="a";-----会出段错误;正确的写法:strcpy(c2, "a");
7. 地址
char a[100]="hello";
printf("%d\n",a);-----显示-1077796936,是个负数,因为地址最高位为1,被看成了符号位,认为是负数
printf("%x\n",a);-----显示bfc21fb8,是个地址;
8. 移位运算符<< , >>
0000 0010 << 1;变成0000 0100 ,相当于乘以2,扩大2倍;
>>1, 变成0000 0001,相当于除以2,减小2倍;
9.数组越界
int a[100]; a是一个整型数组,有100个元素,a[0]~a[99]
a[100]: 在函数中出现的时候,这个错误叫做越界
10. 有符号,无符号存放在内存中都是补码的形式;
正整数:原码,反码 ,补码都一样;
如3:
原码:0000 0000 0000 0011
反码:0000 0000 0000 0011
补码:0000 0000 0000 0011
如-3:
原码:1000 0000 0000 0011
反码:1111 1111 1111 1100 在原码的基础上,符号不变(最高的1),其余取反
补码:1111 1111 1111 1101 在反码的基础上,+1;
11.运算顺序
a=12;
a+=a-=a*a;
a-=a*a; ==> a= a-a*a=12-12*12; ==-132;
a+=a; a=-132-132=-264;
12.逗号运算符
表达式1,表达式2,表达式3,表达式4, 最终的值是表达式4的值
13. 输入输出函数
字符的输入输出函数:putchar(), getchar()
字符串的输入输出函数:gets(). puts();
格式化的输入输出函数:scanf();printf();
putchar(a); 把字符a输出到显示器;
函数原型:int putchar(int c);
int getchar(); 输入的字符到返回值中;
14.格式化的输入输出
%d:带符号的十进制;
%o:无符号八进制;
%x:无符号十六进制;
%u:无符号十进制;
%c:字符形式,一个字符;
%s:字符串的形式;
%f:实数的形式;
%e:指数的形式;
%g:宽度较短的%f, %e的形式;
L:长整型数;
M(正整数):数据的最小宽度;
N(正整数):对实数,表示n个小数;
对字符串,表示截取多少个字符;
“-”:靠左对齐;
%6.2s:“hello” 输出 6列 ,只取 he,前面补四个空格 ;右对齐
%- 6.2s:“hello” 输出 6列 ,只取 he,后面补四个空格 ;左对齐
%6.2f : 1.2345 , 输出的 时候 是 1.23,前面补3个空格 ;右对齐
%-6.2f , 同上,右面补空格,左对齐
15.scanf()
int a,b,c;
scanf("%d,%d,%d",&a,&b,&c);
输入时 :1,2,3,输出为:1,2,3
输入: 1 2 3 输出 1 不定数据
char s1[100];
scanf("%s", s1);
printf("%s\n", s1);
输入: hello 输出 : hello
输入 : hello world 输出 : hello
scanf 遇到空格 结束 输入
注意:读取字符串时,每读完一串要用getchar();清空缓存区
16.gets
输入一个字符串
函数的原型: char *gets(char *s);
char *str="hello world!";------碰到char* 就要想到字符串,指向的是字符串;
函数返回值:如果返回s的指针,正确;
如果返回NULL, 表示操作出现问题,错误;
函数的参数: char *s: 表示从输入设备输入的字符串存放到s所指的空间:
注意:gets()在linux 中认为非常危险,容易出现内存问题;
17. puts
函数的作用:输出一个字符串;
函数的原型:int puts(const char *s);
18.const: 修饰的内容不允许被直接改变;
1) const char *s:
char *s---- s所指向的字符串;s---是指针变量
两个理解:
1. const 修饰的char *,还是s?
const 在这里修饰的是char *;不是s
2. 是char *所指向的字符串不允许改变,还是指针变量s不允许改变?
char * 所指向的字符串不允许被改变; s的地址是可以改变的;
2) char * const s;
表示指针变量s的内容不允许改变;
3) const char * const s;
表示:char *所指向的字符串不允许被改变;指针变量s不允许被改变;
const char *str-----------*str不允许改变
char const *str-----------*str不允许改变
char *const str----------str内容不允许改变,即地址不变
const char *const str ----str,*str都不允许改变
19. 死循环的两种方式
a)while(1){语句;}
b)for(;;){语句;}