关于C语言中二维数组的P+1与*(P+1)个人浅见


本人第一次在51CTO上发表博客,可能会有一些错误,希望各位大神多多指点!好了,闲言少续,我们进入主题:

    在C语言中,有很多数据类型(Int、Float、Char...),那么数组是一种构造类型的数据,个人认为数组是一组具有相同数据类型的数据集合。目前,我们常见的数组为一维、二维的数组。 本文以二维数组为题,首先,我们看一段代码 !

    通过代码,我们知道*(P+1),P+1的值是相同的,但含义不同,先说P+1,无论是一维还是二维数组,数组名都可表两层含义:1、指向其起始元素(a[0])的指针;2、表示自身所占的内存(sizeof(a));本文主要以第一层含义为主,二维数组名a,a代表的是二维数组中第一个元素a[0]的地址,即&a[0],而不是数组本身的地址,数组本身地址用(&a)来表示。 由于,有int (*p)[3]=a;说明这个数组指针指向了二维数组中第一个元素(a[0]这个数组),注意是指向,那么p+1,也就是指向了a[1]这个数组,(p的类型为int (*)[3]),由此可知,*(p+1)是p+1所指向空间的内容,那么,这个内容是什么呢?在二维数组中,运算结果得到了一个一维数组,那么能够代表数组整体的只有数组名,一维数组名代表的是其首元素的首地址,而不代表一维数组的地址,也就是&a[1][0],那么*(p+1)=&a[1][0];

通过,代码可以看出,推论是正确的。那么如果想取二维数组中的数值,我们可以再进行一次“*”运算,也就是*(*(p+1))即*(&a[1][0]);如代码所示 !

这就是我个人的愚见,如果哪里有不对的,烦请各位大神指点一二。

时间: 2024-10-21 09:17:12

关于C语言中二维数组的P+1与*(P+1)个人浅见的相关文章

关于C语言中二维数组传参————————【Badboy】

直接上代码: #include void Fun(int *a[],int m,int n)// { printf("%d\t",*a);//[0][0] /* int e[2][2][2]={8,7,6,5,4,3,2,1}; int *f,***g; g=e; f=e;//有警告,但不会报错 printf("%d\n",*f); */ } /*解释: Fun()中的int *a[2]表示定义指针数组a[2],a[0],a[1]存储的都是指针, a表示的是数组的首

C语言中二维数组如何申请动态分配内存

C语言中二维数组如何申请动态分配内存: 使用malloc函数,先分配第一维的大小,然后再循环分配每一维的大小 #include <stdio.h> #include <malloc.h> int main() { int **a; int i, j; a = (int**)malloc(sizeof(int*)*3);//为二维数组分配3行 for (i = 0; i < 3; ++i){//为每列分配4个大小空间 a[i] = (int*)malloc(sizeof(int

c语言中二维数组作函数参数以及二维数组的理解

当二维数组作函数参数接受主调函数中的二维数组时,退化为一个指向数组的指针. 在此引用<c与指针>中的观点:作为函数 参数的多位数组名的穿递方式和一维数组名相同--实际传递的是个指向数组第一个元素的指针.但是,两者之间的区别在于, 多维数组的每个元素本身是另外一个数组,编译器需要知道它的维数,以便为函数形参的下标表达式进行求值.

Pascal语言中二维数组:矩阵问题

[题目]方阵填数:在一个 N*N的方阵中,填入 1,2..... N*N个数,并要求构成如下格式: 图例:10 11 12  1 9  16 13  2 8  15 14  3 7   6   5   4 [上手]观察图例,不难看出这是一个螺旋矩阵,下面是色彩渐变版大图,纯手工制作(有木有2048的赶脚): [核心代码] 1 //变量赋初值 2 x:=0;//横坐标 3 y:=0;//纵坐标 4 i:=0;//要填入的数字 5 k:=n;//每一轮需要填的方格数 6 j:=1;//填数的方向,1

C语言二维数组作为函数的参数

前言:今天在实现装配线调度程序时候,用到了二维数组,并将其作为函数的参数.在写程序的时候,遇到一些问题,即二维数组做函数的参数应该如何正确表示.我写程序的错误如下程序所示: #include <cstdio> void print(int *a[3]) { printf("%d\n",a[0][0]); } int main() { int a[2][3] = {1,2,3,4,5,6}; print(a); return 0; } 编译程序时候,在第10行提示错误信息:|

C语言 二维数组与指针笔记

今天分析了C语言二维数组和指针的基本理解,感觉有点懵...代码记录一下,如果有大神临幸发现哪里有误,欢迎指正~~~ #include <stdio.h> #include <stdlib.h> #include <string.h> //void func(int p[][]) //这样写等同于void func(int **p) p++移动了四个字节,(*p)++移动了四个字节,不符合二维数组规律 //{ //} //列优先输出的函数(即竖着输出) void func

C++中二维数组的动态分配

作者:   来源:csdn博客   公布者:admin 时间:2009-04-23 13:55:03   点击:115 C++中一维数组的动态分配十分经常使用,但C++刚開始学习的人可能非常少想过要使用动态分配的二维数组,或者自觉得二维数组就是这样分配的(至少我自己開始的时候就这样觉得):int m=2, n=3; int** array2D=new int[m][n];.这全然是我们写多了像int n=4; int* array=new int[n];这种语句留下的后遗症,纯粹是由于惯性太大刹

C语言--二维数组,字符串数组,多维数组

#import <Foundation/Foundation.h> int main(int argc, const char * argv[]) { // int a[2][3]={ // {1,2,3}, // {4,5,6} // }; // int a[2][3]={1,2,3,4,5,6}; // //打印单个元素 // printf("%d",a[1][1]); // //元素没赋全,默认为0 // int b[2][3]={{1,2,3},{4}}; // /

c语言二维数组传递

c语言二维数组传递,目前我总结三种方法,以及纠正一个不能使用的方法 /********************************* * 方法1: 第一维的长度可以不指定 * * 但必须指定第二维的长度 * *********************************/ void fun(int a[][3], int n, int m) { int i, j; for (i = 0; i < n; i++) { for (j = 0; j < m; j++) printf(&quo