深入理解指针(6)--二级指针,指针数组,字符指针

本文详细解释了二级指针的概念,介绍了如何通过二级指针理解更高级别的指针,以及指针数组的使用,包括模拟二维数组。此外,还探讨了字符指针的两种用法,以及常量字符串和普通字符串在内存分配上的区别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

二级指针

指针变量也是一个变量,是变量就需要一个地址,那指针变量的地址存在哪里呢?这就是二级指针。
在这里插入图片描述
上面就是二级指针的画图示意,通过二级指针我们其实就可以理解三级指针,四级指针等,但这些就不是特别常用了,作为了解即可。
对于二级指针有以下操作:

  1. *ppa:通过对ppa进行解引用操纵,这样就可以找到pa。*ppa其实访问的就是pa。
int b =20;
*ppa=&b;//等价于pa=&b
  1. **ppa:先解引用找到pa再解引用找到a。
**ppa=30//等价于*pa=30;
//等价于a=30;

指针数组

指针数组是指针还是数组呢?
我们类比一下,整形数组,是存放整形的数组,字符数组是存放字符的数组。
那么指针数组就是存放指针的数组。这个数组的每一个元素都是一个地址。
在这里插入图片描述
指针数组的每个元素是地址,又可以指向一块区域。

指针数组模拟二维数组

int main()
{
	int arr1[] = { 1,2,3,4,5 };
	int arr2[] = { 2,3,4,5,6 };
	int arr3[] = { 3,4,5,6,7 };

	int* arr[] = { arr1, arr2, arr3 };

	//打印数组
	int i = 0;
	for (i = 0; i < 3; i++)
	{
		int j = 0;
		for (j = 0; j < 5; j++)
		{
			printf("%d ", arr[i][j]);
		}
		printf("\n");
	}

	return 0;
}

在这里插入图片描述
在这里插入图片描述
arr[i]是访问arr数组的元素,arr[i]找到的是数组元素指向的整形一维数组,arr[i][j]就是整型一维数组中的元素。
上述代码模拟出了二维数组的效果,但实际上,它并非一个完全的二维数组,因为上述代码在存储时并不连续,而二维数组在内存上是一段连续的空间。

字符指针变量

在指针类型中我们知道有一种类型为字符指针char*。
一般使用和整形相似

int main()
{
	char ch='w';
	char* pc=&ch;
	*pc='w';
	return 0;
}

字符指针还有一种使用方法

int main()
{
	const char* pstr="hello bit";
	printf("%s",pstr);
	return 0;
}

这里指针pstr其实只存入了hello bit的其实地址,在打印时通过这一个地址找到整个字符串。
在《剑指offer》中有一道相关题目,我们来看一看

int main()
{
    char str1[] = "hello bit.";
    char str2[] = "hello bit.";

    const char* str3 = "hello bit.";
    const char* str4 = "hello bit.";

    if (str1 == str2)
        printf("str1 and str2 are same\n");//1
    else
        printf("str1 and str2 are not same\n");//2

    if (str3 == str4)
        printf("str3 and str4 are same\n");//1
    else
        printf("str3 and str4 are not same\n");//2

    return 0;
}

在上边的代码中,会有怎样的打印结果呢?
在这里插入图片描述
这里的str3和str4指向的是同一个常量字符串。C/C++会把常量字符串存在单独的内存区域,当几个指针指向同一个字符串时,实际上就指向了同一块空间。但是用同样的字符串初始化不同的数组时,就会开辟不同的空间。所以str1与str2不同,str3和str4相同。
今天就先介绍到这里,我们下次再见!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值