时间:2021-05-20
C语言中,指针是一个复杂但又灵活多变的知识点,我们知道,在一维数组中,对于一个数组a[],*a,a,&a,都表示a的首地址,但如果与二维数组混合使用,就显得更为复杂了。例如对于一个二维数组
a[2][4]={{1,2.3},{4,5,6}} a+i,&a[i],*(a+i),a[i],这四个表达式到底表示什么呢?
先告诉答案吧,其实这几个表达式都是指向同一个地址的,也许你会很诧异,也会很疑惑,怎么会是这样呢!!事实证明就是这样的,
C语言中,指针是一个复杂但又灵活多变的知识点,我们知道,在一维数组中,对于一个数组a[],*a,a,&a,都表示a的首地址,但如果与二维数组混合使用,就显得更为复杂了。例如对于一个二维数组
a[2][4]={{1,2.3},{4,5,6}} a+i,&a[i],*(a+i),a[i],这四个表达式到底表示什么呢?
先告诉答案吧,其实这几个表达式都是指向同一个地址的,也许你会很诧异,也会很疑惑,怎么会是这样呢!!事实证明就是这样的。
来看一道题目:
char **p,a[6][8]; 问p=a是否会导致程序在以后出现问题?为什么?
直接用程序说明:
编译,然后就会发现通不过,报错:错误 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节的小启发里讲的很透彻:(以下这段文字及对比一定要认真分析!)
数组和指针参数是如何被编译器修改的?
“数组名被改写成一个指针参数”规则并不是递归定义的。数组的数组会被改写成“数组的指针”,而不是“指针的指针”:
下面再看一个网友的一段分析相当给力的代码:
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
C/C++动态数组的创建的实例详解在C++语言中,二维动态数组主要使用指针的方法建立,以建立一个整数二维数组为例:#include#include#includ
C语言中二级指针的实例详解用图说明示例代码:#includeintmain(intargc,constchar*argv[]){//inta=5;int*p1=
本文实例为大家分享了C语言实现简单三子棋游戏的具体代码,供大家参考,具体内容如下游戏介绍:使用C语言中二维数组和函数的基本知识实现一个三子棋游戏,这个游戏要实现
c语言中经常需要通过函数传递二维数组,有三种方法可以实现,如下:方法一,形参给出第二维的长度。例如:#includevoidfunc(intn,charstr[
本文实例讲述了C#和Java中二维数组区别,分享给大家供大家参考。具体分析如下:在Java中使用二维数组可以如下代码:复制代码代码如下:publicclassA