【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* arr[3]={&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

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

*( pa[i] + j ) //等价于 *( a[i] + j )

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

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

p[ i ][ j ] //等价于 a[i][j]

3.数组指针

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

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

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

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

相关推荐
jiao000011 小时前
数据结构——队列
c语言·数据结构·算法
铁匠匠匠1 小时前
从零开始学数据结构系列之第六章《排序简介》
c语言·数据结构·经验分享·笔记·学习·开源·课程设计
C-SDN花园GGbond1 小时前
【探索数据结构与算法】插入排序:原理、实现与分析(图文详解)
c语言·开发语言·数据结构·排序算法
迷迭所归处2 小时前
C++ —— 关于vector
开发语言·c++·算法
架构文摘JGWZ3 小时前
Java 23 的12 个新特性!!
java·开发语言·学习
leon6253 小时前
优化算法(一)—遗传算法(Genetic Algorithm)附MATLAB程序
开发语言·算法·matlab
Navigator_Z3 小时前
数据结构C //线性表(链表)ADT结构及相关函数
c语言·数据结构·算法·链表
锦亦之22334 小时前
QT+OSG+OSG-earth如何在窗口显示一个地球
开发语言·qt
我是苏苏4 小时前
Web开发:ABP框架2——入门级别的增删改查Demo
java·开发语言
姜太公钓鲸2334 小时前
c++ static(详解)
开发语言·c++