C语言指针进阶

文章目录

  • 1.字符指针
    • 1.1字符
    • 1.2字符串
  • 2.数组指针
    • 2.2数组名和&数组名
    • 2.3数组指针的使用
      • 2.3.1一维数组例子
      • 2.3.2 二维数组传参
        • 2.3.2.1参数是数组的形式
        • 2.3.2.2参数是指针的形式
  • 3.指针数组
  • 4.数组传参和指针传参
    • 4.1 一维数组传参
      • 4.1.1参数为数组的形式,参数为指针的形式
    • 4.2 二维数组传参
      • 4.2.1参数为数组的形式
      • 4.2.2参数为指针
    • 4.3一级指针传参
    • 4.4二级指针传参
  • 5.函数指针
    • typedef函数指针
  • 6.函数指针数组
  • 7.指向函数指针数组的指针
  • 8.回调函数
  • 9.指针和数组面试题
    • 9.1 sizeof
    • 9.2strlen,求字符串的长度,遇到'\0'才结束,strlen的参数是地址,给我一个位置,从这个位置开始向后找'\0'
    • 9.3笔试
  • 10.编程练习
    • 10.1 字符串逆序,gets
    • 10.2结构体
    • 10.3喝汽水
    • 10.4选择
      • 10.4.1strcat(str1,str2)把str2追加到str1后面.头文件string.h
      • strstr找子串strstr(str1,str2)在str1里找一找有没有str2这个子串,返回char*,找到返回子串首字符地址,找不到返回空指针。头文件string.h

C语言指针进阶_第1张图片

1.字符指针

1.1字符

C语言指针进阶_第2张图片

1.2字符串

C语言指针进阶_第3张图片

把常量字符串赋给p,其实是把首字符的地址赋给了p,不是把字符串的地址赋给p,而是把首字符的地址赋给p,不是把字符串放到了p里面

在这里插入图片描述

C语言指针进阶_第4张图片

C语言指针进阶_第5张图片

C++不可以这样写,需要写成
C语言指针进阶_第6张图片

常量字符串不可以更改

C语言指针进阶_第7张图片

所以C里面最准确的写法是加const

C语言指针进阶_第8张图片

练习题

C语言指针进阶_第9张图片

C语言指针进阶_第10张图片
准确一点的写法
C语言指针进阶_第11张图片

2.数组指针

数组指针是指针,存放数组的地址,指向数组的指针

C语言指针进阶_第12张图片
int[10]是数组的类型
C语言指针进阶_第13张图片

C语言指针进阶_第14张图片

C语言指针进阶_第15张图片
pa是一个指针,指向一个数组,这个数组有5个元素,数组每个元素是char*
C语言指针进阶_第16张图片

2.2数组名和&数组名

![!](https://img-blog.csdnimg.cn/0c723cc8983f44b285e8aa848313198d.png)

C语言指针进阶_第17张图片
C语言指针进阶_第18张图片
B0=1116=176 D8=1316+8=216 216-176=40
C语言指针进阶_第19张图片

2.3数组指针的使用

2.3.1一维数组例子

C语言指针进阶_第20张图片

C语言指针进阶_第21张图片
第二个写法
C语言指针进阶_第22张图片

2.3.2 二维数组传参

2.3.2.1参数是数组的形式

C语言指针进阶_第23张图片
C语言指针进阶_第24张图片

2.3.2.2参数是指针的形式

C语言指针进阶_第25张图片

C语言指针进阶_第26张图片

//*(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;
}

C语言指针进阶_第27张图片

parr3和*和[]都可以结合,[]优先级高,所以和[]结合
C语言指针进阶_第28张图片

C语言指针进阶_第29张图片

3.指针数组

指针数组是 数组 用来存放指针的

C语言指针进阶_第30张图片

C语言指针进阶_第31张图片

C语言指针进阶_第32张图片
第二种写法
C语言指针进阶_第33张图片

C语言指针进阶_第34张图片

4.数组传参和指针传参

4.1 一维数组传参

4.1.1参数为数组的形式,参数为指针的形式

C语言指针进阶_第35张图片

4.2 二维数组传参

4.2.1参数为数组的形式

C语言指针进阶_第36张图片

C语言指针进阶_第37张图片

4.2.2参数为指针

C语言指针进阶_第38张图片

4.3一级指针传参

在这里插入图片描述
C语言指针进阶_第39张图片
C语言指针进阶_第40张图片

4.4二级指针传参

C语言指针进阶_第41张图片

C语言指针进阶_第42张图片

5.函数指针

函数指针,是指针,存放函数地址的指针。指向函数的指针

C语言指针进阶_第43张图片
C语言指针进阶_第44张图片
形参的名字可写可不写
C语言指针进阶_第45张图片
*pa就是函数名
C语言指针进阶_第46张图片
C语言指针进阶_第47张图片
C语言指针进阶_第48张图片
C语言指针进阶_第49张图片

C语言指针进阶_第50张图片
在这里插入图片描述
C语言指针进阶_第51张图片

typedef函数指针

C语言指针进阶_第52张图片
C语言指针进阶_第53张图片

6.函数指针数组

函数指针数组,存放函数指针的数组

C语言指针进阶_第54张图片

C语言指针进阶_第55张图片

7.指向函数指针数组的指针

在这里插入图片描述
C语言指针进阶_第56张图片
C语言指针进阶_第57张图片

8.回调函数

通过函数指针调用的函数

C语言指针进阶_第58张图片
C语言指针进阶_第59张图片

print就是回调函数

C语言指针进阶_第60张图片

9.指针和数组面试题

9.1 sizeof

一维数组
sizeof(数组名),&数组名,除此之外,数组名都是首元素的地址
C语言指针进阶_第61张图片

C语言指针进阶_第62张图片

字符数组
C语言指针进阶_第63张图片
字符串

C语言指针进阶_第64张图片

C语言指针进阶_第65张图片

C语言指针进阶_第66张图片

二维数组

C语言指针进阶_第67张图片

C语言指针进阶_第68张图片
C语言指针进阶_第69张图片

9.2strlen,求字符串的长度,遇到’\0’才结束,strlen的参数是地址,给我一个位置,从这个位置开始向后找’\0’

C语言指针进阶_第70张图片

C语言指针进阶_第71张图片

C语言指针进阶_第72张图片

C语言指针进阶_第73张图片
&p得到char**二级指针,二级指针,指向地址,指向4/8个字节,这个系统的指针占4个字节,所以&p+1就向后移四个字节
C语言指针进阶_第74张图片
C语言指针进阶_第75张图片

9.3笔试

指针强制类型转换

在这里插入图片描述

指针±整数

C语言指针进阶_第76张图片
C语言指针进阶_第77张图片
C语言指针进阶_第78张图片

内存中,最小的内存单位是字节,每个字节都给一个地址

C语言指针进阶_第79张图片

逗号表达式

C语言指针进阶_第80张图片
C语言指针进阶_第81张图片
C语言指针进阶_第82张图片

字符串

C语言指针进阶_第83张图片
C语言指针进阶_第84张图片
C语言指针进阶_第85张图片

C语言指针进阶_第86张图片
C语言指针进阶_第87张图片
C语言指针进阶_第88张图片

10.编程练习

10.1 字符串逆序,gets

C语言指针进阶_第89张图片
scanf时输入的字符串不能有空格https://blog.csdn.net/qq_37891604/article/details/133465232
C语言指针进阶_第90张图片
如果想输入hello world可以使用gets
C语言指针进阶_第91张图片

C语言指针进阶_第92张图片

10.2结构体

C语言指针进阶_第93张图片

10.3喝汽水

作业讲解2
在这里插入图片描述

C语言指针进阶_第94张图片
C语言指针进阶_第95张图片

10.4选择

C语言指针进阶_第96张图片
C语言指针进阶_第97张图片

C语言指针进阶_第98张图片

C语言指针进阶_第99张图片

旋转字符串

C语言指针进阶_第100张图片
C语言指针进阶_第101张图片
C语言指针进阶_第102张图片

C语言指针进阶_第103张图片

三步反转法

C语言指针进阶_第104张图片
C语言指针进阶_第105张图片

判断一个字符串是否是另一个字符串反转的结果
常量字符串不让修改,需要改成数组的形式

C语言指针进阶_第106张图片

C语言指针进阶_第107张图片
C语言指针进阶_第108张图片
C语言指针进阶_第109张图片

10.4.1strcat(str1,str2)把str2追加到str1后面.头文件string.h

C语言指针进阶_第110张图片

自己给自己追加不能使用strcat

C语言指针进阶_第111张图片

找到str1的\0,然后把str2字符一个一个放过去,直到遇到\0停止,\0也放过去

C语言指针进阶_第112张图片

strncat
C语言指针进阶_第113张图片
C语言指针进阶_第114张图片

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

C语言指针进阶_第115张图片

你可能感兴趣的:(c语言)