【C语言】指针详解(五)

目录

1.字符指针

1.1常量字符串

2.指针数组

3.数组指针


1.字符指针

字符指针就是指向字符的指针,字符指针可以存储字符变量的地址。

举例如下:

定义指针变量pa存a的地址,改变*pa的值,a也会随之改变 。

1.1常量字符串

😀常量字符串: 需用双引号包着。
例如:" hello " ," 你好 "。

如果说有这样的代码:char* p= "helloworld";这里的"helloworld"就是常量字符串,"helloworld"是存储在常量区的,p指向a的地址。

需要注意的地方:

※常量字符串是不能被修改的,如果说有人想写类似于*pa='hello'的这种代码,程序是会崩溃的,所以说我们可以在前面加上const进行保护,写成const char* p = "hello"这种形式,使用常量指针对其进行保护,使得指针p指向的空间无法被修改避免不当操作使得程序崩溃。

*p为字符串中的第一个元素h,那么*(p+1)就为下一个元素e。

下面一道例题请==大家思考一下:p1和p2,p3和p4是否相等

答案是:p1==p2!=p3!=p4

p1与P2相等原因是"abcde"为常量字符串,存储在常量区,指针p1与p2所以p1和p2都是指向这个常量字符串的,都存储的是a的地址,所以p1和p2是相等的;

而p3和p4分别是两个数组的初始化,所以p3和p4分别表示两个数组的首元素的地址,所以p3和p4是不同的

2.指针数组

指针数组,顾名思义就是存储指针的数组了,例如int* arr3={&a,&b,&c},数组有3个元素,数组中每个元素都是指针,每个元素的类型都是int*,这样的数组就叫做指针数组。

指针数组的一般形式:

数据类型 *数组名常量表达式常量表达式...... ;

下面是一个简单的例子

cpp 复制代码
#include <stdio.h>
int main()
{
    //定义三个整型数组
	int a[5] = { 1,2,3,4,5 };
	int b[5] = { 6,4,8,3,1 };
	int c[5] = { 2,5,8,6,1 };
    //定义一个存放指向整型变量的指针的数组arr
    int* arr[] = { a,b,c };
    //通过接引用打印出三个一维数组的元素
	for (int i = 0; i < 3; i++)
	{
		for (int j = 0; j < 5; j++)
        {
		    printf("%d ", *(arr[i]+j));
	    }
        printf("\n");
    }
	return 0;
}

结果如下:

1 2 3 4 5

6 4 8 3 1

2 5 8 6 1

对于arr的解引用有很多方式,他们都是等价的:

cpp 复制代码
#include<stdio.h>
int main()
{
	int i = 0;
	int a[3][4] = { {1,2,3,4} ,{5,6,7,8} ,{9,10,11,12} };//定义一个二维数组
	int* pa[3];//定义一个指针数组
	for (i = 0; i < 3; i++)//给指针数组赋值
		pa[i] = a[i];
    printf("指针数组的内容为:\n");
	for (i = 0; i < 3; i++)//打印出指针数组的内容
	{
		int j;
		for (j = 0; j < 4; j++)
			printf("%d ", *(*(pa + i) + j));
		printf("\n");
	}
    //以下均为不同方式的解引用操作
    printf("不同解引用操作的结果为:\n");
	printf("%d,%d\n", a[1][1], *(pa[1] + 1));
	printf("%d,%d\n", a[1][1], *(*(pa+1) + 1));
	printf("%d,%d\n", a[1][1], (*(pa + 1))[1]);
	printf("%d,%d\n", a[1][1], pa[1][1]);
    return 0;
}

结果如下:

指针数组的内容为:

1 2 3 4
5 6 7 8
9 10 11 12

不同解引用操作的结果为:

6,6
6,6
6,6
6,6

从以上例子可看出解引用有多种方式,它们的等价形式如下:

*( pai + j ) //等价于 *( ai + j )

*( *(p+i) + j ) //等价于 *( *(a+j) + j )

( *(p+i) ) j //等价于( *(a+i) ) j

p i j //等价于 aij

3.数组指针

数组指针是指向一个数组的指针。更具体地说,它是指向数组的第一个元素的指针。通常用于指向多维数组的第一个维度。例如,如果你有一个包含3个元素的整数数组,你可以声明一个指向这个数组的指针

int (*p)3;即为一个数组指针,p先与*结合,p2是一个指针变量,因此这是一个指针 ,指向大小为3的数组,每个元素的类型为int,所以这是一个数组指针

int *q3;这是一个指针数组,因为**\[\]的优先级高于*p1,** 遇到方括号会先与方括号结合 ,因此这是一个有3个元素的数组 ,而观察q前面的int*,就可以知道这个数组中的每一个元素的类型都是int*,所以这是一个指针数组

以上便是我为大家带来的**指针详解(五)**的内容,若有不足,望各位大佬在评论区指出,谢谢大家!可以留下你们点赞、收藏和关注,这是对我极大的鼓励,我也会更加努力创作更优质的作品。再次感谢大家!

相关推荐
右耳朵猫AI11 小时前
Rust技术周刊 2026年第19周
开发语言·后端·rust
Leweslyh11 小时前
基于 Confucius 架构的无人集群网络控制原语解析
开发语言·网络·php
月落归舟11 小时前
Java线程小记
java·开发语言
摇滚侠11 小时前
01 基础语法 JavaScript 入门到精通全套教程
开发语言·javascript·ecmascript
sleven fung11 小时前
Milvus 向量数据库
开发语言·数据库·python·langchain·milvus
大大杰哥12 小时前
Java 日志框架详解:SLF4J + Logback 从入门到实战
java·开发语言·logback
ylscode12 小时前
黑客利用 GHOSTYNETWORKS 和 OMEGATECH 托管 JS 恶意软件基础设施
开发语言·安全·php·安全威胁分析
爱吃生蚝的于勒12 小时前
QT开发第二章——信号和槽
c语言·开发语言·c++·qt
xcLeigh12 小时前
Python入门:Python3 operator模块全面学习教程
开发语言·python·学习·教程·python3·operator
大叔带刺12 小时前
使用python创建自己的专属星座签名APP:Name2Constell
开发语言·python·pygame