指针拔尖1——(看完包会,不会来打我)


前言:本章节涵盖——

1.指针变量基础知识
2.字符指针
3.数组指针
4.指针数组
5.指针传参


一、指针变量基础

本章我们讲前4节
在这里插入图片描述

二、字符指针

代码如下(示例):

#include<iostream>
using namespace std;
int main()
{
    const char* ps = "hello c++";
	char arr[] = "hello c++";

	cout << ps <<endl;//hello c++,为什么会出现这种情况???指针为什么是字符串,而不是地址
	cout << *ps << endl;//h,解引用就是首元素本身
	cout << *(ps + 1) << endl;//e

	cout << *arr << endl;//h
	cout << arr << endl;//h
}

图例
在这里插入图片描述

为什么会有这种情况?不是说指针存放变量的地址吗?——答案:字符指针指向字符串的地址也指向了字符串本身元素 ,const字符指针是常量
为什么会是字符串?真相只有一个。因为在C语言中,字符串是以字符数组的形式存储的。字符数组由连续的内存空间组成,其中每个元素都存储着字符串中的一个字符。字符指针可以指向字符数组的首地址,也就是字符串的起始位置。当我们通过字符指针访问字符串时,它会从指针指向的内存地址开始连续读取字符,直到遇到字符串的结束标志\0为止。所以字符指针是一种特殊的指针,它可以指向字符数组,又可以指向字符串的地址。
这个是详细解释:总结一句话:"hello c++''就是一个常量。地址比较独特,很难直接获取或者说不允许直接被获取!
下面看一道面试题来巩固提高
在这里插入图片描述
这里str3和str4指向的是一个同一个常量字符串。C/C++会把常量字符串存储到单独的一个内存区域。当几个指针,指向同一个字符串的时候,他们实际会指向同一块内存。但是用相同的常量字符串去初始化不同的数组的时候就会开辟出不同的内存块。所以str1和str2不同,str3和str4不同。

三、指针数组和数组指针

1.指针数组

1.指针数组——顾名思义就是存放指针的数组,可以来打印二维数组
在这里插入图片描述

#include<iostream>
using namespace std;
int main()
{
	int a[5] = { 1,2,3,4,5 };
	int b[] = { 2,3,4,5,6 };
	int c[] = { 3,4,5,6,7 };

	int* arr[3] = { a,b,c };

	for (size_t i = 0; i < 3; i++)
	{
		for (int j = 0;  j < 5;j++)
		{
			cout << arr[i][j]<<" ";
		}
		cout << endl;
	}
}

在这里插入图片描述

2.数组指针
数组指针是指针,指针指向一个数组的首元素的地址,数组名表示数组首元素的地址

在这里插入图片描述
(示例):int arr[5]={1,2,3,4,5},数组名arr表示数组首元素的地址,
int *p=arr; arr是p等价的了,p和arr操作什么打印什么都相同

既然都说到这里了,接下来我们来共同探究数组名和&数组名的区别

拓展:数组名和&数组名的区别

我先把结论和常常用到的知识点告诉大家!!!
除了sizeoof(arr)和&arr中arr表示的是整个数组
其他时候arr都表示数组首元素的地址
arr表示数组首元素的地址,arr+1表示首元素下个元素的地址
&arr表示整个数组的地址。&arr+1表示跳过整个数组, 最后一个元素后的地址也就是下一个数组首元素的地址
arr和&arr地址大小一样,门牌号一样,但意义不一样

在这里插入图片描述在这里插入图片描述

看看例题:

在这里插入图片描述

#include<iostream>
using namespace std;
//数组指针,指向数组的是指针。

int main()
{
	cout << "1.arr和&arr的区别" << endl;

	int arr[10] = { 1,2,3,4,5 };

	int* p1 = arr;//arr为int类型的地址,取出什么样的地址

	cout << p1 << " "<<arr << endl;//你会发现arr和p1一模一样
	cout << p1 + 1<<" "<< arr + 1 << endl;

	int(*p2)[10]= &arr;//取出的是数组的地址

	double *d[5]={};

	double* (*pd)[5] = &d;

	cout << p2 << endl;
	cout << p2 + 1 << endl;

	//括号括起来不要让p和[]结合,否则p就是数组的一部分了
	cout << arr <<" " << &arr << endl;//000000BA42EFFAF8 000000BA42EFFAF8,arr和&arr地址大小一样,门牌号一样,但意义不一样
	//arr是首元素的地址,&arr是数组的地址
	cout << arr + 1 <<" " << &arr + 1 << endl;//	000000BA42EFFAFC 000000BA42EFFB20

	cout <<endl;
	

在这里插入图片描述

数组指针的应用可以干什么????——打印二维数组,传参的作用,做形式参数

#include<iostream>
using namespace std;
void print(int arr[3][5], int r, int c)
{
	for (int i = 0; i < 3; i++)
	{
		for (int j = 0; j < 5; j++) {
			cout << arr[i][j]<<" ";
		}
		cout << endl;
	}
}
 
//p是一个数组指针——指向一维数组的数组指针
void print2(int (*p)[5],int r,int c)
{
	for (size_t i = 0; i < r; i++)
	{
		for (int j = 0; j < c; j++)
		{
			cout<<*(*(p + i)+j)<<" ";
			//*(p+i),把二维数组看出一维数组连在一起
		}
		cout << endl;
	}
}
	cout << "2.数组指针的应用" << endl;

	int arr1[3][5] = {{1, 2, 3, 4, 5}, { 2,3,4,5,6 }, { 3,4,5,6,7 }};
	print(arr1, 3, 5);//arr1数组名,二维数组首元素的地址表示第一行的地址!!!
	cout << "**************" << endl;
	print2(arr1, 3, 5);
	return 0;
}

在这里插入图片描述

四、 指针传参

在这里插入图片描述
在这里插入图片描述

总结

提示:这里对文章进行总结:学习了这半章我们知道了,
1.字符指针指向字符串的地址也指向了字符串本身,他是一个比较特殊的存在,并且const修饰字符指针是常量,只有一份存在。

2.数组指针和指针数组——怎么判断?看最里面括号变量和右边的操作符
int*p[10]指针数组, int(*p)[10]数组指针,我们要记住解引用操作符的优先级很低,没有括号直接被孤立。共同的是他们都可以用来打印二维数组。

3.指针传参
参数类型和放回值类型一定要 一 一 对应,
除了sizeoof(arr)和&arr中arr表示的是整个数组**
其他时候arr都表示数组首元素的地址**
一维数组名arr表示数组首元素的地址,&arr表示整个数组的地址
二维数组名arr表示第一行的地址,&arr数组首元素的地址

例如:以上就是今天要讲的内容,多多点赞支持,下半章火速更新

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小卷同學

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值