1.强制类型转换
对于printf()任何小于int类型的数字都会被转为int类型的数字输出,float会被转为double类型输出。
对于scanf()则不会这样。
2.优先级
!>&&>||
3.函数的声明与定义
函数在使用之前必须先声明再使用。
4.指针学习:
(1)指针应用场景a:通过指针来实现交换两个数的值
(2)指针应用场景b:
函数返回多个值,某些值就只能通过指针返回 ;
传⼊的参数实际上是需要保存带回的结果的变量
(3)
int* p,q;
int *p,q;
这两种方式都只是声明了p为指针型变量,p只是普通型变量。
(4)指针最常⻅的错误:
定义了指针变量,还没有指向任何变量,就开始使⽤ 指针
5.指针与数组
(1)函数参数表中的数组实际上是指针
(2)数组变量是特殊的指针
• 数组变量本⾝表达地址,所以
• int a[10]; int*p=a; // ⽆需⽤&取地址
• 但是数组的单元表达的是变量,需要⽤&取地址
• a == &a[0]
• []运算符可以对数组做,也可以对指针做:
• p[0] a[0]
• *运算符可以对指针做,也可以对数组做:
• *a = 25; • 数组变量是const的指针,所以不能被赋值
• int a[] int * const a=…
区分下面三种表达方式:
int i;
const int* p1 = &i;
int const* p2 = &i;
int *const p3 = &i;
判断哪个被const了的标志是const在*的前⾯还是后⾯。
第一二种属同种情况,表⽰不能通过这个指针去修改那个变量(并不 能使得那个变量成为const)
第三种情况表示⼀旦得到了某个变量的地址,不能再指向 其他变量
6.关于指针加1的问题
指针加1加的数量是该指针类型的大小,相当于数组的下一位。
7.指针的类型
• ⽆论指向什么类型,所有的指针的⼤⼩都 是⼀样的,因为都是地址
• 但是指向不同类型的指针是不能直接互相 赋值的
8.C99之后可以用变量来声明数组的大小,C99之前则用malloc()函数动态申请内存空间
动态申请内存空间需要记住三点
9. 字符串
hello会被编译器变成⼀个字符数组放在某处,这 个数组的⻓度是6,结尾还有表⽰结束的0
很多人说char*是字符串,char*不一定是字符串
• 字符串可以表达为char*的形式
• char*不⼀定是字符串
• 本意是指向字符的指针,可能指向的是字符 的数组(就像int*⼀样)
• 只有它所指的字符数组有结尾的0,才能说它 所指的是字符串
scanf输入字符串: