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