关键词:
二维数组的本质:
int matrix[3][4];
int matrix[3][4]; ==> int [4] matrix[3]; 令type为int[4]; type int[3]; 说明matrix是一个数组,有3个元素;每一个元素是int [4]类型的;
实质上int[4]就是一个拥有4个int元素的一维数组。
事实上,二维数组名称的本质是:二维数组的首地址常量(指针常量);
指针加1移动的是该指针的指类长度。
例:double *p;
p+1 就是移动8字节的长度。
matrix +1 移动了32B,&matrix[3][4] + 1移动了8B,(matrix的指类是 double[4],&matrix[3][4]的指类是double);
c编译器不会对指针指类进行严格检查
scanf("%lf" , matrix);
scanf("%lf" ,*matrix); //两个同样是给二维数组第一个元素从键盘赋值。gcc运行&matrix[3][4]时出现警告,而*matrix不会,他们两的类型是完全相同的。。
&matrix[i][0] => &*(matrix[i] + 0) =>matrix[i];
matrix[i]就是二维数组第i行首地址。
二维数组名称,引用二维数组元素的过程:
matrix[i][j] <=> (*(matrix + i))[j]
*(mareix + i) 中:
matrix + i将移动i * sizeof(double[4])字节空间,即,跳跃i行元素!!!!
然后,*降其阶,是*(matrix)的指类成为double,即,matrix[i]是指针,是下标为i的那一行的首地址,只是,其指类已经变成double!
(matrix[i])[j] <=> *((matrix[i] + j)
matrix[i] + j事实上移动了 j +sizeof (double)个字节,即,在行内移动了J个double元素空间!
*(matrix [i] +j),对其指向的空间引用,实际上引用的就是matrix[i][j]!
关于&matrix
因为matrix的类型是double (*)[4],因此,&matrix的指类就是double (*)[4],那么,&matrix + 1应该移动48字节。
代码检验如下;
#include <stdio.h>
int main()
int num;
double array[10];
double *p;
double matrix[3][4];
// double[4] arr[3], *q = arr; // 这种写法C编译器可能不接受!
printf("%p\n", &num);
p = &array[0]; // <=> p = &(*(array + 0)); <=> p = &*array;
// <=> p = array;
printf("p=%p array=%p &array[0]=%p\n", p, array, &array[0]);
// 证明array就是指针,且指类与p是相同的:
printf("p+1=%p array+1=%p\n", p+1, array+1);
// 指针+1将移动该指针的“指类”长度;因为p的指类是double,
// 因此,p+1应该移动8B;
// 实验结果发现,array+1与p+1移动了相同的字节数,那么,可以说明
// array的指类就是double。
// matrix完全可以看成是一个一维数组的首地址常量:
// double matrix[3][4]; => double[4] matrix[3];
// 令double[4]为type(某种数据类型);那么,对matrix的定义可以看成:
// type matrix[3];
// 在这个角度看,matrix就是一个一维数组名称;根据前面对一位数组名称
// 的讨论可知,matrix是一个指针常量,且其指类为type!
// 更进一步可知:matrix + 1将移动sizeof(type)的长度!
// 即,sizeof(double[4])
printf("sizeof(double[4]):%d\n", sizeof(double[4]));
printf("matrix:%p\t&matrix[0][0]:%p\n", matrix, &matrix[0][0]);
printf("matrix+1:%p\t&matrix[0][0]+1:%p\n", matrix + 1, &matrix[0][0]+1);
// matrix + 1移动了32B;&matrix[0][0] + 1移动了8B;
// 说明:指针常量matrix的值与指针表达式&matrix[0][0]的值相同;
// 但是!这不是两个类型相同的指针,即,指类不同!
// matrix的指类是double[4];&matrix[0][0]的指类是double!
// C编译器在处理两个指针时,在不涉及指类操作的情况下,将一视同仁!
// scanf("%lf", &matrix[0][0]); // 这是给二维数组第一个元素从键盘赋值
// scanf("%lf", matrix); // 这同样可以完成上述任务!
// 在此时,C编译器不对指针指类进行严格检查!!!
// scanf("%lf", *matrix); // 这样的写法将使gcc的警告消失!
// printf("matrix[0][0]:%lf\n", matrix[0][0]);
// 上述实验证明*matrix与&matrix[0][0]类型是完全相同的!
printf("*matrix+1:%p\t &matrix[0][0]+1:%p\n", *matrix+1, &matrix[0][0]+1);
printf("\n&matrix:%p\t &matrix+1:%p\n", &matrix, &matrix + 1);
scanf("%lf", &matrix); // 这样的写法将使gcc的警告消失!
return 0;
指针与数组——二级指针数组初始化数组打印动态二维数组
inta=10;int*p=&a;int**pp=&p;printf("%d %d ",*p,**pp);//1010//数组初始化:inta[4];//里面为未知值inta[4]={0};//初始化为0//二维数组指针intarr1[3][4]={0};int(*pArr)[4]=NULL;pArr=arr1;for(inti=0;i<3;i++){for(intj=0 查看详情
指针与一维数组和二维数组以及字符串指针数组的学习笔记
...,看注释信息理解即可。说明:本程序讨论了一维数组和指针的关系,谈论了二维数组和指针之间的关系,讨论了字符串数组指针数组和指针之间的关系,代码中以给出定义的方法和简单的使用,但是有些使用方法并没有列出,... 查看详情
二维数组与数组指针
...b[0]是0行的首地址,b[1]是1行首地址,b[0]可以赋值给int*的指针,即b[i]是一维数组的首地址,b[i][j]访问的i行第j个元素int*s=b[0]; 下面的代码可以遍历数组,输出每个元素的首地址for(inti=0;i<6;i++) &nb... 查看详情
二维数组与二重指针(代码片段)
1.二重指针1.1应用场景(1)二重指针编程中多数是和指针数组结合起来用int**p1;int*p2[5];p1=p2;(2)有时在函数传参时通过函数内部改变外部的一个指针变量,会以二重指针的方式把这个外部指针变量的地址传进去。voidfunc(int**p)*p=(... 查看详情
c中二维数组与指针访问
//我实在是找不到什么顺眼的方法,只能以退为进,用一级指针指向二维数组的一级地址#include<stdio.h>intmain(void){ inta[5][2]; //int(*b)[5]; //int*(*b)[2]; int*b; & 查看详情
二维数组与双重指针(转)(代码片段)
原文地址:https://blog.csdn.net/u013684730/article/details/46565577一、简介1、二维数组 intarray[10][10]; 函数声明:voidfun(inta[][10]) 函数调用:fun(array); 访问:一般使用a[i][j]来访问 查看详情
二维数组与指针
一道面试题引发的问题,首先要知道[]的优先级高于*,题目:char**p,a[6][8];问p=a是否会导致程序在以后出现问题?为什么?直接用程序说明:#include<stdio.h>voidmain(){char**p,a[6][8];p=a;printf(" ");}编译,然后就会发现通不过,报错... 查看详情
c语言二维数组与指针笔记
今天分析了C语言二维数组和指针的基本理解,感觉有点懵。。。代码记录一下,如果有大神临幸发现哪里有误,欢迎指正~~~#include<stdio.h>#include<stdlib.h>#include<string.h>//voidfunc(intp[][])//这样写等同于voidfunc(int**p)p++移动... 查看详情
二维数组与指针
...以把a[1]赋值给一个类型为int*的变量int*p=a[1]a并不是指向指针a[1]的指针a和a[1]指向的是相同的位置:printf(‘‘%p %p",a,a[0]);当a做为实参传递的 查看详情
数组指针与二维数组的寻址
引例:已知如下程序1#include<stdio.h>2main()3{4intx[3][4]={1,3,5,7,9,11,2,4,6,8,10,12};5int(*p)[4]=x,k=1,m,n=0;6for(m=0;m<2;m++)7n+=*(*(p+m)+k);8printf("%d ",n);9}试写出程序的输出值。(虽然我很讨厌做这种笔头功夫的题,我也坚信编程语言是在 查看详情
多维数组与指针(代码片段)
用指针变量可以指向一维数组中的元素,也可以指向多维数组中的元素,但在概念和使用上,多维数组的指针比一维数组的指针要复杂一些。可以认为二维数组是数组的数组。例:定义:inta[3][4]=1,2,3,4,5,6,7,8,9,10,11... 查看详情
数组的初始化和二维数组指针与数组
1、数组的初始化,比较简单,实例程如下:#include<stdio.h># define M 12int main(void){int days[M]={31,28,31,30,31,30,31,30,30,31,30,31};int i;for(i=0;i<M;i++)printf("Months %d&n 查看详情
一维数组,二维数组,三维数组,数组与指针,结构体数组,通过改变指针类型改变訪问数组的方式
??打印数组中的每一个元素,打印每一个元素的地址:#include<stdio.h>#include<stdlib.h> voidmain(void){ inta[10]={1,2,3,4,5,6,7,8,9,10}; for(int*p=a;p<a+10;p++) //指针类型决 查看详情
关于指针与二维数组之间的那些事
...变量,a可以a+1,但不能++a,但p可以拓展:类型符说明(*指针变量名)[长度]int(*p)[4]&nbs 查看详情
c语言二级指针作为输入(二维数组|二维数组遍历|二维数组排序)(代码片段)
...二、完整代码示例一、二维数组前几篇博客中,介绍的是指针数组;指针数组的结构特征是,数组中的每个元素,即每个指针变量可以指向不同大小的内存块;二维数组与指针数组的结构不同,二维数组的内存结构是整齐的连续的内存块... 查看详情
碎碎念(代码片段)
目录1.typedef定义数组类型2.指针数组3.数组指针4.二维数组5.二维数组是线性存储的(用一维数组方式打印)6.一维(二维)数组与数组指针7.二维数组做函数参数8.sizeof测试一维数组、二维数组1.typedef定义数组类型有typedef是类型,没... 查看详情
关于返回二维数组指针问题
所谓的二维数组指针,是指针的指针,指的就是二维数组在内存中的存储地址。二维数组的地址与一维数组的地址的不同点是:它除了有元素地址外,还有标识各行起始位置的行首地址(称为行的首地址)。行的首地址... 查看详情
c语言指针指向一维数组与二维数组?
请问高人,想定义一个指针指向一个一维/二维数组,(一)double*a;doubledata[3]=1,2,3;a=data;编译正确(二)double*a;doubledata[3][3]=1,2,3,4,5,6,7,8,9;a=data;编译出错:error#515:avalueoftype"double(*)[3]"cannotbeassignedtoanentityoftype"double*"... 查看详情