二维数组和指向指针的指针
一道面试题引发的问题,首先要知道[]的优先级高于*,题目:
char **p,a[6][8]; 问p=a是否会导致程序在以后出现问题?为什么?
直接用程序说明:
#include<stdio.h>
void main()
{
char **p,a[6][8];
p = a;
printf("\n");
}
编译,然后就会发现通不过,报错:错误 1 error C2440: “=”: 无法从“char [6][8]”转换为“char **”
于是乎,我看了下《C专家编程》里10.5节—使用指针向函数传递一个多维数组。
方法一,函数是 void fun(int arr[2][3]); 这种方法只能处理2行3列的int型数组。
方法二,可以省略第一维的长度。函数是 void fun(int arr[][3]);这种方式虽然限制宽松了一些,但是还是只能处理每行是3个整数长度的数组。
或者写成这种形式 void fun(int (*arr)[3]);这是一个数组指针或者叫行指针,arr和*先结合使得arr成为一个指针,这个指针指向具有3个
int类型数据的数组。
方法三,创建一个一维数组,数组中的元素是指向其他东西的指针,也即二级指针。函数是 int fun(int **arr);这种方法可以动态处理各行各列不一样长度的数据。
注意:只有把二维数组改成一个指向向量的指针数组的前提下才可以这么做!比如下面的程序可以正常输出abc:
#include <iostream>
using namespace std;
void test(char **ptr)
{
cout << *ptr << endl;
}
int main()
{
char *p[3] = {"abc", "def", "ghi"};
test(p);
return 0;
}
在《C专家编程》10.3节的小启发里讲的很透彻:(以下这段文字及对比一定要认真分析!)
数组和指针参数是如何被编译器修改的?
“数组名被改写成一个指针参数”规则并不是递归定义的。数组的数组会被改写成“数组的指针”,而不是“指针的指针”:
实参 所匹配的形参
数组的数组 char c[8][10]; char (*)[10]; 数组指针
指针数组 char *c[10]; char **c; 指针的指针
数组指针(行指针) char (*c)[10]; char (*c)[10]; 不改变
指针的指针 char **c; char **c; 不改变
下面再看一个网友的一段分析相当给力的代码:
#include "stdafx.h"
#include <iostream>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
int arr1[3];
int arr2[3];
int arr3[3];
int * ptr;
// ptr1是一个指向 int [3] 的指针,即ptr的类型和&arr1的类型是一样的,注意:arr1指向的内存区域定长
int ptr1[3][3]={{1,2,3},{1,2,3},{1,2,3}};
// ptr2是一个指向 int * 的指针,即ptr2的类型和&ptr是一样的,注意:ptr指向的内存区域不定长
int * ptr2[3]={arr1,arr2,arr3};
// ptr3是一个指向 int [3] 的指针,即ptr3的类型和&arr1的类型是一样的,注意:arr1指向的内存区域定长
int(* ptr3)[3]=&arr1;
ptr3=ptr1; // 没错,他们的类型相同
// ptr3=ptr2;//error 无法从“int *[3]”转换为“int (*)[3]
// ptr4是一个指向 int * 的指针,即ptr4的类型和&ptr是一样的,注意:ptr指向的内存区域不定长
int ** ptr4;
//ptr4=&arr1; //error 无法从“int (*)[3]”转换为“int **
ptr4=ptr2; // 没错,他们的类型相同
//ptr4=ptr3; // error 无法从“int (*)[3]”转换为“int **
return 0;
}
相关文章
- python图像数组操作与灰度变换
- 指针数组 数组指针
- 【C/C++学院】(3)二维数组/二分查找法/指针/模块注射
- C++中的指针、数组指针与指针数组、函数指针与指针函数
- Java实现 LeetCode 713 乘积小于K的子数组(子集数量+双指针)
- Java实现 LeetCode 713 乘积小于K的子数组(子集数量+双指针)
- Java实现 LeetCode 581 最短无序连续子数组(从两遍搜索找两个指针)
- js中常用数组方法concat join push pop slice splice shift
- python找出数组中第二大的数
- 创建数组或项的集合
- php获取一维数组的键和值
- C++二维数组 取地址 复制给 二维指针
- 一些Python中的二维数组的操作方法
- c语言编程-----指向二维数组的指针
- 【数组&双指针】leetcode 283. 移动零【简单】
- 【数组&双指针】LeetCode 76. 最小覆盖子串【困难】
- Leetcode0442. 数组中重复的数据(medium)
- Leetcode0905. 按奇偶排序数组(simple,双指针法)
- C++:C++编程语言学习之数组/字符串/指针/引用/日期&I/O输入输出操作(I/O 库头文件/标准输出流cout/标准输入流cin/标准错误流/准日志流)的简介、案例应用之详细攻略
- Python编程语言学习:批量对array数组数据按照条件限制进行替换/修改、横向拼接两个array矩阵数据
- [h5棋牌项目]-02-找出数组中不重复的数
- 子数组的最小值之和-c语言
- 剑指 Offer II 069. 山峰数组的顶部-c语言
- Leetcode 152. 乘积最大子数组(暴力破解居然可以通过!)
- C++:数组的引用,作形参或是作返回类型,不用指针
- VB编程:利用指针实现数组拆分-44_彭世瑜_新浪博客
- 力扣LeetCode,区域和检索 - 数组可修改
- C语言之数组和指针位移的本质(四十五)
- 指针数组与数组指针
- 指针与数组的对比
- c语言数组和指针相关知识点
- Android 多级指针和数组指针的相关操作
- C语言进阶-指针与数组