关于C语言学习中一些细节和疑惑的记录(2)

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输入字符串:

发布了90 篇原创文章 · 获赞 36 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/weixin_37716512/article/details/103940819