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

时间:2024-04-20 15:52:50

目录

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

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

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