本文主要是介绍指针拔尖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;//ecout << *arr << endl;//hcout << 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 000000BA42EFFB20cout <<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数组首元素的地址
例如:以上就是今天要讲的内容,多多点赞支持,下半章火速更新
这篇关于指针拔尖1——(看完包会,不会来打我)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!