【CPL-2023】W9 W10 W11 笔记-指针

指针

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个位置上

数组指针  ,也是一个指针  每次可以看一行

函数名称本身就是地址
posted @ 2024-02-06 13:38  蚂蚁战大象  阅读(34)  评论(0)    收藏  举报