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*类型)
相关推荐
4 小时前
java关于内部类
java·开发语言
好好沉淀4 小时前
Java 项目中的 .idea 与 target 文件夹
java·开发语言·intellij-idea
lsx2024064 小时前
FastAPI 交互式 API 文档
开发语言
VCR__4 小时前
python第三次作业
开发语言·python
码农水水4 小时前
得物Java面试被问:消息队列的死信队列和重试机制
java·开发语言·jvm·数据结构·机器学习·面试·职场和发展
wkd_0074 小时前
【Qt | QTableWidget】QTableWidget 类的详细解析与代码实践
开发语言·qt·qtablewidget·qt5.12.12·qt表格
东东5164 小时前
高校智能排课系统 (ssm+vue)
java·开发语言
余瑜鱼鱼鱼4 小时前
HashTable, HashMap, ConcurrentHashMap 之间的区别
java·开发语言
m0_736919104 小时前
模板编译期图算法
开发语言·c++·算法
【心态好不摆烂】4 小时前
C++入门基础:从 “这是啥?” 到 “好像有点懂了”
开发语言·c++