C语言进阶————指针1

2026年1月30日学习总结:

今天进入C语言进阶的第二个篇章------指针。指针的主题,我们在初级阶段的指针章节已经接触过了,我们知道了指针的基本概念:

①指针就是个变量,用来存放地址,地址唯一标识一块内存空间;

②指针的大小是固定的4/8字节(32位平台/64位平台)

③指针是有类型的,指针的类型决定了指针±整数的步长,指针解引用操作时候的权限;

④指针的运算。

今天的学习主要分为以下三个部分:

1.字符指针 char*

使用字符指针的两种方法:

①常用方法:

cs 复制代码
char ch = 'w';
char* pc = &ch;
*pc = 'b';

②其他方法:

cs 复制代码
char* p = "abcdef"; 

该表达式的含义是将字符串中首字母a的地址赋值给指针p,

注意:该方法定义下的*p不能被修改(会报错),建议在该使用该方法时加上const。

例题:下列代码的输出结果是?

cs 复制代码
#include<stdio.h>
int main()
{
	const char* ch1 = "abcdef";
	const char* ch2 = "abcdef";

	char arr1[] = { "abcdef" };
	char arr2[] = { "abcdef" };

	if (ch1 == ch2)
		printf("ch1==ch2\n"); //相同
	else
		printf("ch1!=ch2\n");

	if (arr1 == arr2)
		printf("arr1==arr2\n");
	else
		printf("arr1!=arr2\n"); //不相同
	return 0;
}

输出结果:

为什么会出现这种结果呢,首先两个数组arr1和arr2虽然内容相同但是数组的地址不同所以两个数组不同。对于ch1和ch2在前面加了const的字符串不能修改,所以可以将其看成常量,在内存中会有专门的只能读不能写的寄存器中存储,在该内存中如果出现完全相同的变量,为节省空间自动将其看成一个变量,所以就会出现ch1等于ch2的情况。

2.指数数组:是一个存放指针的数组。

cs 复制代码
int arr[10]; //整型数组,每一个元素都是int类型变量
char ch[5]; //字符数组,每一个元素都是char类型变量
int* arr2[6]; //整型指针数组,每一个元素都是int*类型的变量
char* arr3[5]; //字符指针数组,每一个元素都是char*类型的变量

利用指针数组构建二维数组:

cs 复制代码
#include<stdio.h>
int main()
{
	int arr1[] = { 1,2,3,4,5 };
	int arr2[] = { 2,3,4,5,6 };
	int arr3[] = { 3,4,5,6,7 };

	int* prr[3] = { arr1,arr2,arr3 };

	//访问打印二维数组
	int i = 0;
	for (i = 0; i < 3; i++)
	{
		int j = 0;
		for (j = 0; j < 4; j++)
		{
			//方法一:通过加整数进行访问
			//printf("%d ", prr[i] + j); 
			//方法二:通过二维数组的方法访问
			printf("%d ", prr[i][j]);
		}
		printf("\n");
	}
	return 0;
}

3.数组指针:是指针,指向数组的指针。

整型指针:指向整型的指针;

浮点数指针:指向浮点数的指针;

cs 复制代码
int* p1[10]; //是指针数组
int (*p2)[10]; //p2是数组指针,p2可以指向一个数组

在这里我们再次讨论一下数组名的含义:

通常来说数组名等于首元素地址,但是有两个例外:

①sizeof(数组名) 表示整个数组,计算整个数组的大小;

②&数组名 表示整个数组,取出整个数组地址;

用一个例子更好的理解一下:

cs 复制代码
#include<stdio.h>
int main()
{
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };

	printf("%p\n", arr);
	printf("%p\n", arr + 1);//步长值为4字节,元素int*

	printf("%p\n", &arr[0]);
	printf("%p\n", &arr[0] + 1);//步长值为4字节,元素int*

	printf("%p\n", &arr);
	printf("%p\n", &arr + 1);//步长值为整个数组,直接跳过该数组

	return 0;
}

输出结果为:

回到数组指针

cs 复制代码
int arr[10] = { 0 };
int* p = arr;
int (*p2)[10] = &arr;//p2的类型是int(*)[10]
int* p=&arr; 
//运行时会报错,该方法定义不严谨,因为类型不匹配(arr是int数组类型,而p是int*类型)
相关推荐
2zcode22 分钟前
基于MATLAB深度学习的乳腺钼靶影像乳腺癌智能诊断系统设计与实现
开发语言·深度学习·matlab·乳腺癌
MoonBit月兔25 分钟前
错过大赛报名?MoonBit 开源大赛- 8 月黑客松正式开启
开发语言·ai-native·moonbit
weixin_5386019741 分钟前
智能体测开Day31
开发语言·python
geovindu1 小时前
java: Facade Pattern
java·开发语言·后端·外观模式·结构型模式
listening7771 小时前
HarmonyOS 6.1 元服务深度优化:从“秒开”到“常驻”的极致体验
java·开发语言·spring
布朗克1681 小时前
Go 入门到精通-29-测试与基准
开发语言·后端·golang·测试与基准
无相求码2 小时前
C程序的内存到底怎么分的?栈、堆、全局区一张图讲清楚
c语言
格林威2 小时前
工业相机Chunk功能全解析:图像嵌入时间戳、编码器元数据(附堡盟C#代码)
开发语言·人工智能·数码相机·计算机视觉·c#·视觉检测·工业相机
小大宇2 小时前
Python 集成 Conda
开发语言·python·conda
天空'之城2 小时前
C 语言工业级通用组件手写 08:精准软件消抖
c语言·嵌入式开发·工业级组件·软件消抖·按键防抖