指针一:
一.了解指针
例如 int * p; p是指针变量,这个变量是用来存放指针(地址)的,int * 是指针的类型, p是指针的名字,*p就是地址存放的内容:p就是地址,*是解引用,*p是把这个地址的内容读取出来
二.额外知识补充
1.类型取值范围推导
char c; 它的取值范围是127~-128 ,因为char类型是占用两个字节,也就是8个比特位,所以原码可以是0111111 也就是 127,然后0111111加1就是11111111,第一位是符号位,也就是-0,但是这里是写死的,所以规定-0=-128
2.类型向上转换
这个是类型向上转换,转换成double的取值范围了,所以取值范围变大了,自然能进行准确的计算
指针二:
一.常属性const
例如 const int const * const p,被const 修饰的指针变量就是常变量,简单的讲,讲const 放在*左边就会限制*p ,就是说*p的内容不可以修改,而如果在*的右边,就会限制p,我们知道,p是地址,所以p的地址不能被修改,
正常:
const 在*左边:*p的内容不能修改
cosnt在*的右边:p即地址不能修改:
二.变长数组
C99 之前不支持变长数组,数组大小是需要常量、常量表达式来指定的,不能是变量
三.野指针
一个局部变量不初始化的话,它的值是随机的 int* p;//p是局部变量,但是没有初始化,其值是随机值的,如果将p中存放的值当做地址 解引用操作符就会形成非法访问
1类型:
2类型:
一个是形参原因,退出就把空间销毁了导致的
3类型
第二个是 NULL,没给明确的地址
四.传值调用 传址调用
传值调用 :不改变值
传址调用:会改变对应的值
五.assert
#define NDEBUG 这个跳过assert 检测的代码
指针三
一.必要知识
数组名是数组首元素的地址但是有两个例外就是sizeof(arr) 和 &arr,它们是整个数组的地址
二.指针的输入输出方式
*(p+i)可以替换为*(arr+i) arr[i]可以替换为i[arr]也就是*[i+arr];
三.数组指针 指针数组
数组指针的函数类型是int (*)[ ] 指针数组的类型是 int * [ ]
数组指针简单示例
指针数组
区分指针数组,小编认为看int * 和int 就行,因为int *是指针的标志嘛,所以有int *的就是指针数组
四.函数指针
这里pf和(*pf) ,取决于作者喜好,都可以
指针四
一.二维数组的打印
二.qsort 函数
回调函数
qsort是c语言中的一个库函数,这个函数是对数据排序,对任意类型的数据都能排序
qsort默认是升序
qsort的基本排序,void(void*base,size_t num,size_t size,int(*cmp)(const void *,const void *))
第一个是指向待排序的第一个元素的指针
第二个是base指向元素中的个数
第三个是base指向数组中的一个元素的大小,单位是字节
第四个是函数指针,传递函数的地址
三.题目
注意:内容涉及8的答案就是涉及打印地址,如果系统是X64就是8,系统是X32
1.
2.
3.
4.
5.
6.
7.
8.