![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/b8e1f59dffb9ff27c9dfd34e610296f8.png)
1.字符指针
1.1字符
1.2字符串
把常量字符串赋给p,其实是把首字符的地址赋给了p,不是把字符串的地址赋给p,而是把首字符的地址赋给p,不是把字符串放到了p里面
C++不可以这样写,需要写成
常量字符串不可以更改
所以C里面最准确的写法是加const
练习题
准确一点的写法
2.数组指针
数组指针是指针,存放数组的地址,指向数组的指针
int[10]是数组的类型
pa是一个指针,指向一个数组,这个数组有5个元素,数组每个元素是char*
2.2数组名和&数组名
![!](https://img-blog.csdnimg.cn/0c723cc8983f44b285e8aa848313198d.png)
B0=1116=176 D8=1316+8=216 216-176=40
2.3数组指针的使用
2.3.1一维数组例子
第二个写法
2.3.2 二维数组传参
2.3.2.1参数是数组的形式
2.3.2.2参数是指针的形式
//*(p+i)相当于arr[i]
void print(int(*p)[5], int x, int y) {
for (int i = 0; i < x; i++) {
for (int j = 0; j < y; j++) {
printf("%d ", (*(p + i))[j]);
}
printf("\n");
}
}
void print1(int(*p)[5], int x, int y) {
for (int i = 0; i < x; i++) {
for (int j = 0; j < y; j++) {
printf("%d ", p[i][j]);
}
printf("\n");
}
}
int main(int argc, char const*argv[])
{
int arr[3][5] = { {1,2,3,4,5}, {2, 3, 4, 5, 6},
{3, 4, 5, 6, 7} };
print(arr, 3, 5);
print1(arr, 3, 5);
system("pause");
return 0;
}
parr3和*和[]都可以结合,[]优先级高,所以和[]结合
3.指针数组
指针数组是 数组 用来存放指针的
第二种写法
4.数组传参和指针传参
4.1 一维数组传参
4.1.1参数为数组的形式,参数为指针的形式
4.2 二维数组传参
4.2.1参数为数组的形式
4.2.2参数为指针
4.3一级指针传参
4.4二级指针传参
5.函数指针
函数指针,是指针,存放函数地址的指针。指向函数的指针
形参的名字可写可不写
*pa就是函数名
typedef函数指针
6.函数指针数组
函数指针数组,存放函数指针的数组
7.指向函数指针数组的指针
8.回调函数
通过函数指针调用的函数
print就是回调函数
9.指针和数组面试题
9.1 sizeof
一维数组
sizeof(数组名),&数组名,除此之外,数组名都是首元素的地址
字符数组
字符串
二维数组
9.2strlen,求字符串的长度,遇到’\0’才结束,strlen的参数是地址,给我一个位置,从这个位置开始向后找’\0’
&p得到char**二级指针,二级指针,指向地址,指向4/8个字节,这个系统的指针占4个字节,所以&p+1就向后移四个字节
9.3笔试
指针强制类型转换
指针±整数
内存中,最小的内存单位是字节,每个字节都给一个地址
逗号表达式
字符串
10.编程练习
10.1 字符串逆序,gets
scanf时输入的字符串不能有空格https://blog.csdn.net/qq_37891604/article/details/133465232
如果想输入hello world可以使用gets
10.2结构体
10.3喝汽水
作业讲解2
10.4选择
旋转字符串
三步反转法
判断一个字符串是否是另一个字符串反转的结果
常量字符串不让修改,需要改成数组的形式
10.4.1strcat(str1,str2)把str2追加到str1后面.头文件string.h
自己给自己追加不能使用strcat
找到str1的\0,然后把str2字符一个一个放过去,直到遇到\0停止,\0也放过去
strncat