指针
1.W9
指针就是存储内存地址的变量
*是一个单目运算符
*p既可以作为左值也可以被作为右值
可以把*p当做一个变量的别名来理解
void fun(int a[], int len)
等价于
void fun(int *a, int len)
第一个参数是数组名称的时候,方括号里不需要写数量,传过来的只是一个数组的地址
野指针 指针在使用前没有指向任何变量,因此里面存储的可以是任意的初始值
任何类型的指针只是存储地址的变量,区别在于不同类型的指针的解读内存方式不同
大端小端字节存储方式
小端存储是为了保持在访问的内存地址不变的情况下,方便截取到地位(低字节)的数字
%p 输出指针类型变量
虚拟内存随机化 防止攻击
ASLR
int[] p
p[i] 等价于 *(p+i) 加一个数据类型的大小
*p++ 等同于 *(p++) *优先级没有++高
取出p所指的数据来 顺便把p移到下一个位置
多维数组和指针
int m[3][2] = {
1,2
3,4
5,6
}
int (*p)[2] = m;//&m[0]
int *q = m[0];//&m[0][0]
从p的视角出发 看到的是一个有两个元素的int类型的数组
指针和const
主要区分为const在*前还是*后
int * const p = &a; //p指针指向关系一旦确定不可改变
*p = 100; //OK
p = &b;//ERROR
p++;//ERROR
指针所指向的是const
const int * p = &a; //表示不能通过该指针修改此变量(并不能使变量变成const)
*p = 100; //ERROR
a = 100; //OK
p = &b; //OK
数组名称天然是const,不可改变值,常量地址
2.W10
字符串指针和字符数组
char *msg2 = "Hello"
通过这个指针不可以修改字符串
因为这个字符串是存储在常量数据区,这个区域的字符串是不可以修改的
strlen 返回字符串长度 不包括\0
无符号数是不会小于零的
两个无符号数相减还是无符号数
两个无符号数字可以比大小
字符串拷贝时,拷贝的目标地址应该是可修改的
常量数据区域的字符串地址是不可修改的!
3.W11
strcmp 函数语义 前者更大返回的是正数 后者更大返回的是负数
char * array[N] 指针数组 每一个元素是一个指针,指向一个字符串
选择排序:每次扫一轮 ,没一轮找出最小的元素,放在要放的位置
比如第一轮,把找出来的元素放在第0个位置上
数组指针 ,也是一个指针 每次可以看一行
函数名称本身就是地址