C语言学习笔记(二)

1. 关于数组
下标和数组一起使用,用于标识该集合中某个特定的值;
数组名的值是一个指针常量,也就是数组第一个元素的地址;

2. 数组与指针
数组与指针具有一些完全不同的特征。数组具有确定数量的元素,而指针只是一个标量值。只有当数组名在表达式中使用时,编译器才会为他产生一个指针常量。
当数组名作为sizeof操作符或单目操作符&操作数时,指针与数组不同,sizeof返回整个数组的长度,而不是指向数组的指针的长度。&取一个数组名的地址所产生的是一个指向数组的指针,而不是一个指向指针常量的指针。
声明指针时,编译器会为其分配保留指针内存的空间。而声明数组时,编译器将根据声明所指定的元素为数组保留空间。

3.指针与数组下标的效率问题
当你根据某个固定数目的增量在一个数组中移动,使用指针变量比使用数组下标产生效率更高的代码。当这个增量是1并且机器具有地址自动增量模型时,这一点表现的更加突出;
声明为寄存器变量的指针通常比位于静态内存和堆栈中的指针效率更高;
使用单独的计数器效率会降低;
那些必须在运行时求值的表达式较之诸如&array[SIZE]或array+SIZE这样的常量表达式往往代价更高;

4. malloc
malloc从内存池中个提取一块适合的内存,并向该程序返回一个指向这块内存的指针。但这块内存并没有进行任何方式的初始化。
malloc分配的是一块连续的内存。并且分配的比你请求的多一部分,比如malloc(100)可能会分配132大小的内存,前32个作为头,记录这块内存的信息,比如地址,大小,已便于系统管理,实际分配与用户管理的仍是100大小的内存。

5. 高级声明
int a; 声明变量a
int *a; 声明指针a, a地址存放的是整形数据
int **a; 二级指针a,a指向一个指针,这个指针指向的地址存放了int型数据
int a[]; 声明数组a;
int a[]; []的优先级高于 ’ ‘,所以a是一个指针数组,a数组中存放的是指向Int型数据的指针
int (* a)[]; a数组指针,a是个指针,指向一个数组,数组中存放的数据是int型的
int a(); 因为()优先级高于’ ‘,a首先是一个函数,一个函数调用,这个函数返回值为int型,参数列表为空
int (* a)(); a是函数指针,指向的函数返回值为int,参数列表为空
int ( a[])(); a是一个指针数组,数组中存放的指针指向返回值是int *型,参数列表是空的函数

6.回调函数
当有时候编写的函数不适用于其他数据类型时,我们期待一种方法使得函数与数值无关。(比如查找函数既可以用于数组又可以用于链表)
回调函数就是解决这类问题出现的。
用户把一个函数指针作为参数列表传递给其他函数,后者将回调用户的函数,这种技巧的函数就是回调函数。

7.命令行参数
main()函数的完整写法应该是

int main(int argc, char **argv)

返回值为int 型,为0表示正常返回,不为0表示非正常退出。
参数argc表示的是main()命令行参数的个数。argv表示的是指向一组参数值(也可以写作 char *argv[])。
比如

    gcc -o main main.c fun1.c

argc等于5
argv*[]:

argv[0]   'g''c''c''0'
argv[1]   '-''o''0'
argv[2]   'm''a''i''n''0'
argv[3]   'm''a''i''n''.''c''0'
argv[4]   'f''u''n''1''.''c''0'
'0'

8.字符串常量
字符串常量出现在表达式中时,它的值是一个指针。

"xyz" + 1
指针值加上1值还是指针,指向字符串的第二个字符: y
*"xyz"
对一个指针执行间接访问操作,结果是指针所指向的内容,为首字母:x
"xyz"[2]
同样的相当于*p = xyz p[2] = ? 答案是字母 : z

9. I/O流
标准函数使我们在C程序中执行与文件相关的I/O任务非常方便。下面是文件I/O的一般情况。
程序为必须同时处于活动状态的每个文件声明一个指针变量,其类型为FILE*,这个指针指向这个FILE结构,当它处于活动状态时由流使用。
流通过调用fopen函数打开。你必须指定需要访问的文件或设备以及他们的访问方式。
根据需要对文件进行读取或写入。
调用fclose函数关闭流。关闭一个流可以防止它关联的文件被再次访问,保证任何储存于缓冲流的数据被正确地写到文件中,并且释放FILE结构使它可以用于另外的文件。
r : 读取 w :写入 a : 添加

FILE * fopen(char const *name, char const *mode);
int fclose(FILE *f);
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值