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*类型)