-
2022-01-24 22:41:56
指针与二维数组
二维数组的地址
int a[3][4]={{1,3,5,7},{9,11,13,15},{17,19,21,23}};
以上就是算二维数值地址的方法。
指向数组数值地址的表达方式:
&a[1][2]; a[1]+2; *(a+1)+2; //用这个最有B格。 &a[0][0]+1*4+2; //用地址来计算
指向数组数值的表达方式:
a[1][2]; *(a[1]+2); *(*(a+1)+2); //用这个最有B格。 *(&a[0][0]+1*4+2); //用地址来计算
解释:
a+1
与a[1]
分别为行==指针==和==列指针==,所表示的都为二维数组一行的元素的地址,行指针加“星号”转换为列指针,即为:a+1---->*(a+1);所以说,*(a+1)
也是列指针。当表示地址时,就可以用以上表格的方式来表示。指针的运用
先看代码:
#include<stdio.h> int main() { int a[3][4]={1,3,5,7,9,11,13,15,17,19,21,23}; int *p; for(p=a[0];p<a[0]+12;p++) { if((p-a[0])%4==0) printf("\n"); printf("%4d ",*p); } }
这里指针p指向二维数组a的第一行的第一个元素,当运用p++时,则会指向下一个元素。
这里还有一句要提的话。由于p++遍历懂得元素都是挨边儿的,所以每遍历一次,地址(不对,不能说成地址,而是位移量)相加一,所以代码
p-a[0])
可以表示出各个元素的位置。非常方便。字符串与指针
接着先上代码:
#include <stdio.h> void main( ) { char *string=“I love China!”; printf(“%s\n”,string); string+=7; while(*string) { putchar(string[0]); string++; } }
这里
*string
来建立字符串指针,指向字符串“I love china ”,这里字符串可以看作一个字符串变量,来被指针取地址。char str[20]; str=“I love China!”; //这样是错误的 char *cp; cp=“I love China!”; //利用指针指向数组
更多相关内容 -
C语言 指针与二维数组详解
2020-12-31 14:08:24二维数组在概念上是二维的,有行和列,但在内存中所有的数组元素都是连续排列的,...C语言中的二维数组是按行排列的,也就是先存放 a[0] 行,再存放 a[1] 行,最后存放 a[2] 行;每行中的 4 个元素也是依次存放。数组 a -
C语言指针与二维数组资料详解(附示例代码)
2021-05-20 14:26:53C语言指针与二维数组资料详解(附示例代码)二维数组在概念上是二维的,有行和列,但在内存中所有的数组元素都是连续排列的,它们之间没有“缝隙”。本文是百分网小编搜索整理的关于C语言指针与二维数组资料详解(附...C语言指针与二维数组资料详解(附示例代码)
二维数组在概念上是二维的,有行和列,但在内存中所有的数组元素都是连续排列的,它们之间没有“缝隙”。本文是百分网小编搜索整理的关于C语言指针与二维数组资料详解(附示例代码),供参考学习,感兴趣的小伙伴们可以参考一下!想了解更多相关信息请持续关注我们应届毕业生考试网!
以下面的二维数组 a 为例:
int a[3][4] = { {0, 1, 2, 3}, {4, 5, 6, 7}, {8, 9, 10, 11} };
从概念上理解,a 的分布像一个矩阵:
0 1 2 3
4 5 6 7
8 9 10 11
但在内存中,a 的分布是一维线性的,整个数组占用一块连续的内存:
C语言中的二维数组是按行排列的,也就是先存放 a[0] 行,再存放 a[1] 行,最后存放 a[2] 行;每行中的 4 个元素也是依次存放。数组 a 为 int 类型,每个元素占用 4 个字节,整个数组共占用 4×(3×4) = 48 个字节。
C语言允许把一个二维数组分解成多个一维数组来处理。对于数组 a,它可以分解成三个一维数组,即 a[0]、a[1]、a[2]。每一个一维数组又包含了 4 个元素,例如 a[0] 包含 a[0][0]、a[0][1]、a[0][2]、a[0][3]。
假设数组 a 中第 0 个元素的地址为 1000,那么每个一维数组的首地址如下图所示:
为了更好的理解指针和二维数组的关系,我们先来定义一个指向 a 的指针变量 p:
int (*p)[4] = a;
括号中的*表明 p 是一个指针,它指向一个数组,数组的类型为int [4],这正是 a 所包含的每个一维数组的类型。
[ ]的优先级高于*,( )是必须要加的,如果赤裸裸地写作int *p[4],那么应该理解为int *(p[4]),p 就成了一个指针数组,而不是二维数组指针,这在《C语言指针数组》中已经讲到。
对指针进行加法(减法)运算时,它前进(后退)的步长与它指向的数据类型有关,p 指向的数据类型是int [4],那么p+1就前进 4×4 = 16 个字节,p-1就后退 16 个字节,这正好是数组 a 所包含的每个一维数组的长度。也就是说,p+1会使得指针指向二维数组的下一行,p-1会使得指针指向数组的上一行。
数组名 a 在表达式中也会被转换为和 p 等价的指针!
下面我们就来探索一下如何使用指针 p 来访问二维数组中的每个元素。按照上面的定义:
1) p指向数组 a 的开头,也即第 0 行;p+1前进一行,指向第 1 行。
2) *(p+1)表示取地址上的'数据,也就是整个第 1 行数据。注意是一行数据,是多个数据,不是第 1 行中的第 0 个元素,下面的运行结果有力地证明了这一点:
#include
int main(){
int a[3][4] = { {0, 1, 2, 3}, {4, 5, 6, 7}, {8, 9, 10, 11} };
int (*p)[4] = a;
printf("%d
", sizeof(*(p+1)));
return 0;
}
运行结果:
16
3) *(p+1)+1表示第 1 行第 1 个元素的地址。如何理解呢?
*(p+1)单独使用时表示的是第 1 行数据,放在表达式中会被转换为第 1 行数据的首地址,也就是第 1 行第 0 个元素的地址,因为使用整行数据没有实际的含义,编译器遇到这种情况都会转换为指向该行第 0 个元素的指针;就像一维数组的名字,在定义时或者和 sizeof、& 一起使用时才表示整个数组,出现在表达式中就会被转换为指向数组第 0 个元素的指针。
4) *(*(p+1)+1)表示第 1 行第 1 个元素的值。很明显,增加一个 * 表示取地址上的数据。
根据上面的结论,可以很容易推出以下的等价关系:
a+i == p+i
a[i] == p[i] == *(a+i) == *(p+i)
a[i][j] == p[i][j] == *(a[i]+j) == *(p[i]+j) == *(*(a+i)+j) == *(*(p+i)+j)
【实例】使用指针遍历二维数组。
#include
int main(){
int a[3][4]={0,1,2,3,4,5,6,7,8,9,10,11};
int(*p)[4];
int i,j;
p=a;
for(i=0; i<3; i++){
for(j=0; j<4; j++) printf("%2d ",*(*(p+i)+j));
printf("
");
}
return 0;
}
运行结果:
0 1 2 3
4 5 6 7
8 9 10 11
指针数组和二维数组指针的区别
指针数组和二维数组指针在定义时非常相似,只是括号的位置不同:
int *(p1[5]); //指针数组,可以去掉括号直接写作 int *p1[5];
int (*p2)[5]; //二维数组指针,不能去掉括号
指针数组和二维数组指针有着本质上的区别:指针数组是一个数组,只是每个元素保存的都是指针,以上面的 p1 为例,在32位环境下它占用 4×5 = 20 个字节的内存。二维数组指针是一个指针,它指向一个二维数组,以上面的 p2 为例,它占用 4 个字节的内存。
【C语言指针与二维数组资料详解(附示例代码)】相关文章:
-
深入浅出理解C语言指针与二维数组.pdf
2021-09-19 13:18:13深入浅出理解C语言指针与二维数组.pdf -
【C语言指针与二维数组传参】
2022-03-21 13:51:45二维数组与指针的关系与易错1 二维数组传参的三种方式:2 二位数组传参所理解的歧义:总结 前言 什么是指针? 指针是地址的另外一种表达形式,那为什么要叫做指针呢?我的理解是这样:当我们已经有了地址的时候,...指针与二维数组传参
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
指针的误区与进阶
前言
什么是指针?
指针是地址的另外一种表达形式,那为什么要叫做指针呢?我的理解是这样:当我们已经有了地址的时候,需要一个动作来定位这个地址,我们把这个动作记为指向,而针表示箭头的方向。接下来我们要开始正文。
提示:以下是本篇文章正文内容,下面案例可供参考
一、指针的错误
打代码的时候需要规避的
1.野指针:野指针就是指针指向的位置是不可知的(随机的、不正确的、没有明确限制的)
2.空指针:(NULL)对空指针间接访问会报错
3.有的时候我们已经用其进行传参,但是没有发挥作用,甚至警告!(自己编的名,哈哈)二、示范
1.普通的利用函数交换两个数值可能有过这样的情况
代码如下(示例):
include <stdio.h> int main() { int a=3,b=5; swap(a,b); printf(“max=%d,min=%d\n”,a,b); return 0; } void swap(int x,int y) //这时候的x,y为形参,函数返回后自动销毁 { int temp; //并不能够实现交换数值 temp=x; x=y; y=temp; }
这时候我们需要利用指针进行传址以地址的形式进行访问:
void swap(int *p1,int *p2) { int temp; temp=*p1; *p1=*p2; *p2=temp; } int main() { int a=3,b=5; if (a<b) swap(&a,&b); printf(“max=%d,min=%d\n”,a,b); // 5 3 return 0; }
2.下面展示一下错误
代码如下(注意一下与上面的区别):
void swap(int *p1,int *p2) { int * temp;//这里定义成了一个指针,但是没有指向的整形变量 *temp=*p1;//因此这里无法进行赋值 *p1=*p2; *p2=*temp; } int main() { int a=3,b=5; if (a<b) swap(&a,&b); printf(“max=%d,min=%d\n”,a,b); // 5 3 return 0; }
当然,如果我们将它改为:
void swap(int *p1,int *p2) { int * temp=NULL;//上述提到过,空指针会报错,不能这样定义 *temp=*p1; *p1=*p2; *p2=*temp; } int main() { int a=3,b=5; if (a<b) swap(&a,&b); printf(“max=%d,min=%d\n”,a,b); // 5 3 return 0; }
也可以这么理解:temp初始化为一个确定的值,当进行下一次赋值的时候,相当于将p1这个值赋给了temp,我们知道,确定的值只能赋值给不确定的变量,而它却将一个确定的值p1赋值给了NULL,这显然是不成立的。
三. 二维数组与指针的关系与易错
1 二维数组传参的三种方式:
int a[m][n] int a[][n] int(*a)[n]//二维数组对应数组指针,下面会用到
首先看一下第一个与第二个的区别,m是可有可无的,故我们将注意力转到n上面,当我们想输入一个二维数组首先要知道他的行与列,而n对应的参数应不小于我们输入的变量,例如:当输入n=100时,传参所对应的参数a[][n]中的n应该为大于等于100的常数,否则会出现遗漏,导致传进的参数不是二微元素的所有变量,与野指针有异曲同工之妙
2 二位数组传参所理解的歧义:
当我们介绍完二维数组的三种传参方式之后,我们知道,类比一维数组,传参的时 候,可以这样: 代码如下:
#include<stdio.h> void swap(int* p) { *p = 0; } int main() { int a = 5; swap(&a); printf("%d", a);//0 return 0; }
这里用到了指针中常见的*符号,我们称之为解引用符号,这里不得不提到我当时犯下的错误,当时我认为一个一维数组arr[]传参,*arr代表取出首元素的地址,那么当我进行二维数组app[][]传参时,可不可以这样传 app(这里暂时不当成二级指针,由于后面星号打不出来,我将用-代替)就是将-(-app)括号里面的对比一维数组可以联想到是取出首行元素的地址,也就是说,把(-app)看做一个一维数组,还能-出他的首元素地址(呜呜呜,看起来没什么问题,但这样就错了呀)
上图:
后来才知道,是因为已经被二级指针所占用,或许是因为二级指针的思维比这样的思维优先吧(说来惭愧,呜呜呜)。
总结
主要说明了传地址的问题与一些自己经历的一些有关二维数组传地址的错误,前人踩过的后人不必再踩,本着这样的初心,我将继续改进,希望能对小伙伴们有所帮助(也是为了自己记笔记哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈(此处省略一万字)…)
-
用指针引用二维数组元素 C语言 指针引用二维数组 为什么
2021-05-21 06:42:09用指针引用二维数组元素 C语言 指针引用二维数组 为什么用指针引用二维数组元素 C语言 指针引用二维数组 为什么相关问题:匿名网友:a 是数组首地址,等于 &a[0][0].*p 声明里是指针。语句里 *p 是 指针指向的值。...导航:网站首页 >
用指针引用二维数组元素 C语言 指针引用二维数组 为什么
用指针引用二维数组元素 C语言 指针引用二维数组 为什么
相关问题:
匿名网友:
a 是数组首地址,等于 &a[0][0].
*p 声明里是指针。语句里 *p 是 指针指向的值。 语句里 p 是地址.
*p 是1个星号的指针,可以让它指向1维数组,也可以让有序地它指向2维数的各元素。
int a[行][列]; a[j][i] 数组元素排列 是:
第一行 的 第1列,第二列,第三列....
第二行 的 第1列,第二列,第三列....
第三行 的 第1列,第二列,第三列....
2维数可以看成1维数组,排成1字长蛇阵:第一行 的 第1列,第二列,第三列..;
第二行 的 第1列,第二列,第三列....;。。。。直到最后一行最后一列。
#define row 3
#define col 4
int a[row][col]; // 某一元素: a[j][i]
int *p,i,j;
排成1字长蛇阵后,一维下标,可以用二维 下标计算: j*col + i.
某一元素: a[j][i] 的 数值 就是 * (p+j*col+i);
----
写出完整程序,依次输出所有元素,对比:
#include
main()
{
#define row 3
#define col 4
int a[row][col] = { 0,1,2,3,4,5,6,7,8,9,10,11};
int *p;
int i,j;
p=&a[0][0];
for (j=0;j
for (i=0;i
printf("\n");
}
printf("===========\n");
for (j=0;j
for (i=0;i
printf("\n");
}
return 0;
}
======
如果 是 int **p; 才有 *(*(p+i)+j))形式。
对应 a[j][i], 指向的值 是 *(*(p+j) + i)
匿名网友:
1.用指针引用二维数组元素
问:int a[][],*p; 如何用指针引用a[][]? p与a的区别是什么?(如:*(*...
2.C语言 指针引用二维数组 为什么
问:二维数组在内存里面也是线性排列的,为什么直接int *p=a;(a为一个二维...
3.C语言调用二维数组元素时,能否用指针指向其中同一...
答:指针的值一次只能指向一个地址,不能同时访问多个地址,但是可以通过指针的移位来依次访问二维数组同一行的多个元素。例如:*(*(arry+0) + 1)可以访问二维数组arry的第0行,第1列的元素
4.用指针 调用二维数组里的元素 所用两个* 表示的意义
问:我想问一下 用指针 调用二维数组里的元素 所用两个* 表示的意义 像:*(*...
5.c语言二维数组用指针表示的问题
问:#include void main() { int a[3][4]={1,3,5,7,9,11,13,15,17...
6.C语言怎么用指针代替二维数组
答:看你具体的应用,提供几个方法供参考: 1、一级指针 例: int a[M][N]; int *p = &a[0][0]; 相当于将二维数组当一维数组用,需要自己根据N的大小计算下标,使用却很灵活 2、指针数组 例: int a[M][N]; int *p[M]; for(int i=0; i
7.求C语言高手指点:请问如何指针定义二维数组?? ...
问:这几种方法逻辑上都好理解,但我就是在具体表达上面有很大问题,求高手...
8.C语言 怎么用指针输出一个二维数组的全部值
答:C语言的数组(不管多少维)在内存中都是线性储存的。所以用一级指针加偏移就可以访问所有元素。 举个例子,有一个10*10的二维数组a,这样就可以输出: int a[10][10];int *p = (int *)a;int i;for (i = 0; i < 10 * 10; i++)printf(%d, *(p + ...
9.如何让指针指向二维数组?
问:还有要怎么利用指针去引用二维数组中的元素
10.假如我想用指向二维数组的指针来输入几串字符串,然...
答:下面的例子告诉你想知道的问题: main() { char a[5][50]; char (*p)[30];//声明指向二维数组的指针 int i; p=a; for(i=1;i
问题推荐
-
c语言指针与二维数组
2021-03-14 21:27:27c语言指针与二维数组 欢迎关注AWP资讯 二维数组的定义和内存模型先来了解一下,我们还是先定义一个二维数组 int b[2][3]; 先不给它赋值,考虑一下它的具体含义,这里代表的是两组含有3个整形数据的数组,定义的话... -
C语言指针(二维数组)
2021-05-07 20:58:571.二维数组 1.1、二维数组的内存映像 (1)一维数组在内存中是连续分布的多个内存单元组成的,而二维数组在内存中也是连续分布的多个内存单元组成的。 (1)从内存角度来看,一维数组和二维数组没有本质差别。 (2)二维... -
C语言中二维数组作为函数参数来传递的三种方法
2020-08-25 16:20:03主要给大家介绍了关于C语言中二维数组作为函数参数来传递的三种方法,文中通过示例代码介绍的非常详细,对大家学习或者使用C语言有一定的参考学习价值,需要的朋友们下面来一起学习学习吧 -
C语言指针与二维数组关系研究与探讨.doc
2021-05-21 05:13:22C语言指针与二维数组关系研究与探讨C语言指针与二维数组关系研究与探讨[摘要] 指针是C语言的精华和重要特色,也是C语言学习的重点和难点,本文重点对指针,指针变量,指针与二维数组关联的方法进行了深入探讨与研究... -
C语言指针与一维数组、二维数组之间的关系
2021-02-17 23:44:301.指针与一维数组的关系。 这无疑是最简单的,我们常见的有p=a,其p是指针变量,a是数组名。这里需要注意的是数组名和数组元素的区别。数组名代表数组的首地址,可以直接让指针指向它。而数组元素是值,需要取地址符... -
C语言指针与二维数组(二维数组与一维数组关系)
2015-06-17 21:52:42、二维数组元素的地址 定义如下二维数组: int a[3][4] = { {0,1,2,3}, {4,5,6,7}, {8,9,10,11} }; a为二维数组名,此数组有3行4列, 共12个元素。但也可这样来理解,数组a由三个元素组成:a[0], a[1], a[2]。... -
C语言函数调用二维数组,指针问题
2021-05-25 04:35:44话题:C语言函数调用二维数组,指针问题回答:正如楼下所言 int **p ,定义的p是一个指向int*型的指针int (*p)[1]是一个指向数组的指针 数度为1假如定义成 deal(int **p),传参数时要加类型转换: deal((int**)a);... -
C语言 使用指针遍历二维数组
2021-05-25 04:06:58二维数组在内存中存储是线性连续的,可以计算出二维数组的偏移量,进而使用一级指针遍历二维数组/**使用1级指针访问二维数组因为数组本身在地址空间中就是连续排列的,根据行数和列数,计算出访问单元的 地址偏移量 ... -
C语言 通过指针访问一维数组,二维数组,三维数组。
2021-05-21 05:53:05/**通过指针来访问一维数组,二维数组,多维数组*/#includeconst int COLS=3;const int COUNT=4;//通过一级指针,计算偏移量来遍历一维数组void printSingleDimensionalArray(int *data,int data_len);//通过一级... -
C语言中用指针传递二维数组
2021-12-10 15:21:41C语言中用指针传递二维数组 -
C语言指针表示二维数组
2017-09-28 16:12:45#include int main() { int i,j; int (*ptr)[3]; int score[2][3]={{100...(二维数组:)//其中line,list表示矩阵的行列 int** array; array=new int*[line]; for(int i=0;i;i++) a[i]=new int[list]; -
C语言指针的理解五:二重指针与二维数组
2021-03-03 11:26:42C语言中指针的理解5:二重指针与二维数组1.二重指针1.1 二重指针与普通一重指针的区别1.2 二重指针的用法1.3 一些概念的实质2.二维数组2.1 二维数组的内存映像2.2 二维数组下标理解和访问2.3 二维数组的应用和更多维... -
C语言中二维数组指针的简要说明
2021-01-01 05:58:58C语言中,指针是一个复杂但又灵活多变的知识点,我们知道,在一维数组中,对于一个数组a[],*a,a,&a,都表示a的首地址,但如果与二维数组混合使用,就显得更为复杂了。例如对于一个二维数组 a[2][4]={{1,2.3},{4... -
C语言 指针+二维数组详解 (应付期末、考研的最强笔记,建议收藏)
2021-09-03 11:24:02本文通过从二维数组的介绍开始,讲解什么是二维数组——>怎么定义和使用二维数组——>怎么引用二维数组的元素——>怎么通过指针来引用二维数组(具体包括多种分式)来逐步说明指针+二维数组的配合使用,相信学完本文... -
二维数组与指针详解
2018-01-20 15:00:54详细讲述了二维数组与指针之间的联系,对于学习C语言,理解指针数组吗,数组指针,数组与指针之间的关系有重要的帮助。仔细学习完该文档,详细你不会再为指针和数据而困惑。 -
[C语言]二维数组数组名详解,及数组指针传参
2022-03-10 15:55:50对于二维数组及数组指针的详解 -
C语言指针学习 二维数组最大值及位置
2020-11-01 17:39:27二维数组最大值及位置 Description 有一个3*4的矩阵,要求编程求出其中值最大的那个元素,以及其所在的行号和列号。(如果最大数有多个,则显示第1个出现的数据的信息) Input 从键盘输入12个数字组成一个3*4的... -
C语言 动态创建二维数组
2021-05-21 04:42:17/*C语言 如何动态创建二维数组转化为一维数组申请数组,创建和释放都比较简单*/#include #include #include #define RANK 10#define COLUMN 7int main(){int i,j;int (*p)[COLUMN];//动态生成二维数组,指定列数为... -
c语言——用二维数组名对二级指针赋值
2021-05-30 00:32:48通过下面的例子你将了解到二维数组与二级指针进行指针运算的本质区别。 char array[3][4]={"January","February","March","April","May","June","July","August","Setember","October","November","December"}; /...