C语言灵魂——指针(2)(适合小白)

180 阅读3分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 5 天,点击查看活动详情

二、指针与数组

1、指针和数组关系

一、指向数组的指针 指针变量 [下标] * (指针变量+偏移量)

二、指针运算 跟指针类型 对应的基本类型

三、指针数组 每一个元素都是一个指针 指针数组是一个二维数组模型

数组和下标 02数组和下标.png 指针数组的框图表示

03指针数组.png

04指针数组.png

2、多级指针

  • 一级指针指向变量的地址

  • 二级指针指向一级指针的地址

  • 三级指针指向二级指针的地址

各级指针间的关系如下

  • 三级指针==二级指针==&一级指针

** 三级指针==* 二级指针==一级指针==&变量

*** 三级指针==** 二级指针==* 一级指针==变量

多级指针框图表示 05多级指针.png 多级指针程序示例如下所示

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>
#include<time.h>

int main0401()
{

	int a[] = { 1,2,3 };
	int b[] = { 4,5,6 };
	int c[] = { 7,8,9 };
	//指针数组是一个特殊的二维数组模型
	//指针数组对应于二级指针
	int* arr[] = { a,b,c };

	//指针数组和二级指针建立关系
	int** p = arr;


	//arr[0][0] a[0]
	//printf("%d\n", **p);
	//二级指针加偏移量 相当于跳过了一个一维数组大小
	//printf("%d\n", **(p + 1));
	//一级指针加偏移量 相当于跳过了一个元素
	//printf("%d\n", *(*p + 1));//arr[0][1]

	//printf("%d\n", *(*(p + 1) + 1));


	for (int i = 0; i < 3; i++)
	{
		for (int j = 0; j < 3; j++)
		{
			//printf("%d ", p[i][j]);
			//printf("%d ", *(p[i] + j));
			//printf("%d ", *(*(p + i) + j));
		}
		puts("");
	}
	return EXIT_SUCCESS;
}

int main0402(void)
{
	int a = 10;
	int b = 20;
	int* p = &a;
	int** pp = &p;
	int*** ppp = &pp;
	//*ppp==pp==&p
	//**ppp==*pp==p==&a;
	//***ppp==**pp==*p==a

	//*pp = &b;//等价于p=&b;
	**pp = 100;
	//*pp = 100;//err
	printf("%d\n", *p);
	printf("%d\n", a);
	return 0;

}

3、指针与函数

一、值传递和地址传递

二、数组作为函数参数 退化为指针丢失精度 需要传递元素个数

三、指针作为函数返回值

4、指针与字符串

一、栈区字符串和数据区字符串

二、字符串数组 指针数组模型

三、const修饰的指针 针对于字符串

四、主函数的形参

int argc  表示参数个数

char* argv[]  表示参数内容

五、字符串和指针的应用

  • 字符串查找字符串个数

  • 字符串查找字符个数

  • 字符串反转和回文

六、字符串处理函数

strcpy() strncpy() 字符串拷贝

strcat() strncat() 字符串追加

strcmp() strncmp() 字符串比较 0 1 -1

sprintf() sscanf() 字符串格式化

strchr() strstr() 字符串查找 返回值类型为指针

strtok() 字符串分割 如果找到标志位用\0替换 会破坏源字符串

atoi() atof() atol() 字符串类型转换

写在文末

这是本人在学习C语言过程中的点滴记录,希望分享出来能与大家一起进步,如有表达不足或者有错误的地方,恳请大家积极批评指正!!

屏幕截图 2023-02-05 170438.jpg