唠唠C++二级指针、二维数组、指针数组、数组指针等的区分
今天看c++primer第六章,有这部分的内容,脑子有点糊涂了,看了几篇博客,自己敲了下,记录一下备忘。
二级指针:
int **p;
二维数组:
int p[10][10];
char q[10][10];
指针数组:
int *p[10];
数组指针:
int (*p)[10];
咋区分后面这俩呢,记住[]的优先级比*高,所以上面写法,p先和后面的[10]结合,也就是p首先是个10个元素的数组,那么前面的int *就是元素类型,也就是存了10个int指针的数组。
那么下面这个写法把 * p括起来,那首先p就是个指针,指向什么呢,还剩下前面的int和后面的[10],也就是这个指针指向10个int的数组。
归纳一下,先看变量名跟前后谁结合,结合之后就可以判断变量类型。然后把这部分拿走,看剩下的是什么。
然后另外一点,int * p1[10]这是个指针数组,int  * * p2是个二级指针。p1[0]、p1[1]、p1[2]…等都代表不同数组的地址。数组首地址和指针相同,故p1和p2意义一样。* p1得到的是p1的第一个元素,是一个int指针。* p2得到的也是一个int指针,两者一致。
证明:下面代码可以运行无报错
int f(int **p)
{
	return 0;
}
int main()
{
	int* q[10];
	f(q);
}
但如果把q定义为二维数组、数组指针等等就都会报错。
二维数组为什么不行:例如int q[10][10];,q就不是个指针,q不能自增自减,这显然不能转化为二级指针。
数组指针为什么不行:例如int (*q) [10];,q确实是指针了,但q+1和q在内存距离差多少呢,是差10个int,而p和p+1差就差1个int(4个字节)。下图为证,故也不能替换。
这里q是指针数组,等同于二级指针,相邻内存差4,1个指针占4字节,也就是差距一个指针变量的距离。

下面q是数组指针,可以看见q和q+1内存差距28,十进制就是40,即10个int的空间。

所以数组指针和二级指针(指针数组)为什么不能混用的原因就很明显了,有疑问可以评论区交流,今天就先总结到这里。		2019年10月22日 00:31:48
唠唠C++二级指针、二维数组、指针数组、数组指针等的区分的更多相关文章
- C语言语法笔记 – 高级用法 指针数组 指针的指针 二维数组指针 结构体指针 链表 | IT宅.com
		
原文:C语言语法笔记 – 高级用法 指针数组 指针的指针 二维数组指针 结构体指针 链表 | IT宅.com C语言语法笔记 – 高级用法 指针数组 指针的指针 二维数组指针 结构体指针 链表 | I ...
 - 洛谷 P1972 [SDOI2009]HH的项链-二维偏序+树状数组+读入挂(离线处理,思维,直接1~n一边插入一边查询),hahahahahahaha~
		
P1972 [SDOI2009]HH的项链 题目背景 无 题目描述 HH 有一串由各种漂亮的贝壳组成的项链.HH 相信不同的贝壳会带来好运,所以每次散步完后,他都会随意取出一段贝壳,思考它们所表达的含 ...
 - int (*p)[4] p 是二级指针 二维数组 二级指针 .xml
		
pre{ line-height:1; color:#2f88e4; background-color:#e9ffff; font-size:16px;}.sysFunc{color:#3d7477; ...
 - C-指针,二级指针,二维数组作为函数参数使用,C语言链表(详解)
		
一级指针 int *p; //表示定义一个int型(4字节)的指针p &p //表示p自身的地址位置 p ...
 - C语言指针系列 - 一级指针.一维数组,二级指针,二维数组,指针数组,数组指针,函数指针,指针函数
		
1. 数组名 C语言中的数组名是一个特殊的存在, 从本质上来讲, 数组名是一个地址, 我们可以打印一个指针的值,和打印一个数组的值来观察出这个本质: int nArray[10] ={ 0 }; in ...
 - C++笔记-数组指针/二维数组转换指针
		
参考资料: 1. 作者 BensonLaur :https://www.cnblogs.com/BensonLaur/p/6367077.html 2. https://blog.csdn.net/ ...
 - C++ 指针二维数组, C++二维指针数组笔记
		
C++ 二维动态数组 一. 已知第一维 #include <iostream> using namespace std; int main(int argc, char const *ar ...
 - c语言中数组,指针数组,数组指针,二维数组指针
		
1.数组和指针 ] = {,,,,};// 定义数组 // 1. 指针和数组的关系 int * pa = array; pa = array; // p[0] == *(p+0) == array[0 ...
 - poj3067 二维偏序树状数组
		
题解是直接对一维升序排列,然后计算有树状数组中比二维小的点即可 但是对二维降序排列为什么不信呢?? /* */ #include<iostream> #include<cstring ...
 - hdu1081 DP类最大子段和(二维压缩+前缀和数组/树状数组计数)
		
题意:给出一个 n * n 的数字矩阵,问最大子矩阵和是多少. 由于和最长子段和问题类似,一开始想到的就是 DP ,一开始我准备用两个循环进行 DP ,对于每一个 (i,j) ,考察(i - 1,j) ...
 
随机推荐
- RN开发-Linux开发环境搭建(Ubuntu 12.04)
			
1.首先安装JDK 2.安装Android开发环境 3.安装node.js 3.1 官网下载 : node-v6.9.1-linux-x64 3.2 添加环境变量 sudo vi /etc/profi ...
 - 开班信息CSS实现
			
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
 - 数字输出精度 - C语言
			
1. 浮点型/双精度浮点型 double a=1234.5678; printf("%8.2lf\n",a);// 小数点前的数表示总位数,小数点也算一位 printf(" ...
 - python 处理protobuf协议
			
背景:需要用django基于python3模拟一个http接口,请求是post方式,body是protobuf string,返回也是protobuf string 设计:django获取pb str ...
 - 给阿里云主机添加swap分区,解决问题:c++: internal compiler error: Killed (program cc1plus)
			
前言 今天安装spdlog,一个快速得C++日志库,按照文档步骤,不料出现了一堆错误,像c++: internal compiler error: Killed (program cc1plus)等一 ...
 - centos7使用jenkins启动找不到模块
			
问题: 在jenkins上启动pycharm项目报:ModuleNotFoundError: No module named 'wanwenyc' 其中‘wanwenyc’为pycharm工程项目路径 ...
 - SSL扫描工具
			
工具: sslciphercheck sslscan sslciphercheck.exe -h ip -p 443 有些IP会报错:
 - js -- 高阶函数的使用
			
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
 - Python爬取ithome的一所有新闻标题评论数及其他一些信息并存入Excel中。
			
# coding=utf-8 import numpy as np import pandas as pd import sys from selenium import webdriver impo ...
 - tensorflow学习笔记——GoogLeNet
			
GoogLeNet是谷歌(Google)研究出来的深度网络结构,为什么不叫“GoogleNet”,而叫“GoogLeNet”,据说是为了向“LeNet”致敬,因此取名为“GoogLeNet”,所以我们 ...