C语言指针进阶


在这里插入图片描述

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
在这里插入图片描述
在这里插入图片描述

strstr找子串strstr(str1,str2)在str1里找一找有没有str2这个子串,返回char*,找到返回子串首字符地址,找不到返回空指针。头文件string.h

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值