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

文章目录

  • 前言:本章节涵盖——
  • 一、指针变量基础
  • 二、字符指针
  • 三、指针数组和数组指针
  • 拓展:数组名和&数组名的区别
  • 四、 指针传参
  • 总结


前言:本章节涵盖——

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


一、指针变量基础

本章我们讲前4节
指针拔尖1——(看完包会,不会来打我)_第1张图片

二、字符指针

代码如下(示例):

#include
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
}

图例
指针拔尖1——(看完包会,不会来打我)_第2张图片

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

三、指针数组和数组指针

1.指针数组

1.指针数组——顾名思义就是存放指针的数组,可以来打印二维数组
指针拔尖1——(看完包会,不会来打我)_第4张图片

#include
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;
	}
}

指针拔尖1——(看完包会,不会来打我)_第5张图片

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

指针拔尖1——(看完包会,不会来打我)_第6张图片
(示例):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地址大小一样,门牌号一样,但意义不一样

指针拔尖1——(看完包会,不会来打我)_第7张图片指针拔尖1——(看完包会,不会来打我)_第8张图片

看看例题:

指针拔尖1——(看完包会,不会来打我)_第9张图片

#include
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;
	

指针拔尖1——(看完包会,不会来打我)_第10张图片

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

#include
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——(看完包会,不会来打我)_第11张图片

四、 指针传参

指针拔尖1——(看完包会,不会来打我)_第12张图片
指针拔尖1——(看完包会,不会来打我)_第13张图片

总结

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

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

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

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

你可能感兴趣的:(c++,笔记,开发语言)