前提概要
这是大一鼠鼠的第一篇博客,在学指针的时候时常很晕,听老师讲的很清楚,但是自己一动手敲,老是不明原理,不知道为啥,所以想花时间整理一下,可能里面用语不专业,还有可能存在错误,欢迎大家来指正!
二维数组以及二维数组管理字符串
一.前提条件
明确“ * ”符号的用途
-
指针声明:用于定义指针变量
-
解引用符:获取指针变量的值
知道字符串数组的特性,获得第一个地址,可以全部输出
二.区分各种情况
首先,放一个代码在下面,这是鼠鼠实验的代码(想展示一个思考的过程,当时就把自己想到的全部情况试了一下,所以会比较没逻辑)
#include<iostream>
using namespace std;
int main()
{
char s[4][10]{ "student","STUDENT" };//请输出,地址,一个内容和一个指定的字母
cout << s << endl;//s[0][0]的地址
cout << s[0] << endl;//student
cout << *s << endl;//student,隐式转换为s[0][0],字符串可以接连输出
cout << s[1] << endl;//STUDENT
cout << *(s + 1) << endl;//STUDENT,隐式转换为s[1][0],字符串的特性,可以接连输出
cout << s[0][0] << endl;//s
cout << *(s)+1 << endl;//tudent,注意容易出错,先隐式转换为s[0][1],在输出
cout << *(s + 1) + 1 << endl;//TUDENT,先隐式转换为s[1][1],在输出
cout << *(*(s)+1) << endl;//t,*(s)+1已经是s[0][1]的地址,在*则直接输出该内容,不会持续输出
cout << *(*(s + 1) + 1) << endl;//T
int arr[3][4]{ 1,2,3,4,5,6,7,8,9,10,11,12 };
cout << arr << endl;//arr[0][0]的地址
cout << *arr << endl;//arr[0][0]的地址
cout << arr[0] << endl;//arr[0][0]的地址
cout << arr[0][0] << endl;//arr[0][0]的值
cout << **arr << endl;//arr[0][0]的值
cout << **(arr + 1) << endl;//arr[1][0]的值
cout << *(arr)+1 << endl;//arr[0][1]的地址
cout << *(*(arr)+1) << endl;//arr[0][1]的值
cout << *(*(arr + 1) + 1) << endl;//arr[1][1]的值
cout << *(*(arr)+1) + 1 << endl;//arr[0][1]+1的值
return 0;
}
其他二维数组 | 管理字符串的二维数组 | 说明 | |
---|---|---|---|
arr | arr[0][0]的地址 | arr[0][0]的地址 | |
*arr | arr[0][0]的地址 | arr[0] [0]的地址(但是输出内容) | 其他数组只解了一层,还有一层没解;字符串的数组的特性可以全部输出 |
**arr | arr[0][0]的值 | arr[0][0]的值 | 对于字符串,*arr已经到了a[0][0],让它可以输出了,在来一次的话,就会只取arr[0][0]的值 |
*(arr+1) | arr[1][0]的地址 | arr[1][0]的地址(但是会输出内容) | |
*(arr)+1 | arr[0][1]的地址 | arr[0][1]的地址(但是会从a[0][1]开始输出内容) | |
*(arr+1)+1 | arr[1][1]的地址 | arr[1][1]的地址(从arr[1][1]开始输出内容) | |
**(arr+1) | arr[1][0]的值 | arr[1][0]的值 | |
**(arr)+1 | arr[0][1]的值 | arr[0][1]的值 | |
**(arr+1)+1 | arr[1][1]的值 | arr[1][1]的值 | |
* (*(arr+1)+1) | arr[1][1]的值 | arr[1][1]的值 |
这些就是目前了解的全部了