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

ops/2024/10/20 5:06:47/

目录

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*,这样的数组就叫做指针数组。

指针数组的一般形式:

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

下面是一个简单的例子

#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 };//定义一个存放指向整型变量的指针的数组arrint* 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的解引用有很多方式,他们都是等价的:

#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*,所以这是一个指针数组

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


http://www.ppmy.cn/ops/5644.html

相关文章

OpenHarmony轻量系统开发【4】编写第一个程序、启动流程分析

摘要&#xff1a;本文简单介绍如何编写第一个hello world程序&#xff0c;以及程序是被执行的 适合群体&#xff1a;适用于Hi3861开发板&#xff0c;启动流程分析 4.1编写第一个程序 编写一个hello world程序比较简单&#xff0c;可以参考官网&#xff1a; https://gitee.c…

node基础 第二篇

01 ffmpeg开源跨平台多媒体处理工具&#xff0c;处理音视频&#xff0c;剪辑&#xff0c;合并&#xff0c;转码等 FFmpeg 的主要功能和特性:1.格式转换:FFmpeg 可以将一个媒体文件从一种格式转换为另一种格式&#xff0c;支持几乎所有常见的音频和视频格式&#xff0c;包括 MP…

C++练级之路——类和对象(中二)

1、运算符重载 C为了增强代码的可读性引入了运算符重载&#xff0c;运算符重载是具有特殊函数名的函数&#xff0c;也是具有其返回值类型&#xff0c;函数名字以及参数列表&#xff0c;其返回值类型和参数列表与普通的函数类似。 函数名字为&#xff1a;关键字operator后面接需…

4.3雷达建图与导航(冰达机器人实现)

4.3雷达建图与导航 4.3.1启动激光雷达和数据查看 本节内容介绍激光雷达的启动和雷达数据的查看 机器人端启动激光雷达roslaunch robot_navigation lidar.launch 此时查看话题列表就会发现多了一个scan话题&#xff0c;这个就是雷达发布的。看到这个话题说明雷达已经正常启动。…

使用PHP开发体育赛事直播平台,有这些缺点和优点

"东莞梦幻网络科技"作为体育直播平台开发领域的领导者&#xff0c;选择使用PHP开发体育赛事直播平台的现成源码&#xff0c;为什么会选择该语言&#xff0c;背后的选择理由可以从该技术的优点和缺点中找到答案。 一、优点1、易学易用与快速开发&#xff1a;PHP语言语…

启动 UE4编辑器报 加载 Plugin 失败

启动 UE4编辑器报 加载 Plugin 失败&#xff0c;报如下错误&#xff1a; Plugin ‘SteamVR’ failer to load because module ‘SteamVR’ could not be found. Please ensure the plugin is properly installed, otherwise consider disabling the plugin for this project. …

selenium篇-基础用法

Selenium WebDriver 是一款流行的自动化测试工具&#xff0c;用于模拟浏览器的各种操作。以下是一些Selenium WebDriver 中最常用的基本命令和方法摘要&#xff1a; 打开网页 (Get) 使用 get() 方法打开指定URL&#xff1a; Python 1driver.get("http://www.example.com&…

中国人的谦逊与生俱来

中国人的谦逊是与生俱来的&#xff0c;我们从老子的《道德经》就能探知一二&#xff1a; 一、不自夸、不自傲 《道德经》原文&#xff1a;自见者不明&#xff1b;自是者不彰&#xff1b;自伐者无功&#xff1b;自矜者不长。&#xff08;第二十四章&#xff09; 译文&#xff…