二维数组:
char a[][];
二维数组实质上也就是一维数组,a[2][3]可看做一个2个元素的一维数组,这2个元素又是另一个数组,在内存中,它的排布如下:
#include "stdio.h" int main(int argc, char *argv[])
{
char a[][]={{,,},{,,}}; for(int i=; i<;i++)
for(int j=;j <;j++)
{
printf("a[%d][%d]=%d\n", i, j, a[i][j]);
}
for(int i=; i<;i++)
for(int j=;j <;j++)
{
printf("a[%d][%d] Addr=0X%X\n", i, j, (int)&a[i][j]);
}
return ;
}
数组指针:
char a[][]={{,,},{,,}};
char (*p)[]=a; //a为一维数组的数组名,类型为char (*)[3]
char *p=a[]; //a[1]为二维数组的数组名,即{2,4,8}数组的首地址,类型为char *
char (*)p[][]=&a //&a为整个数组的首地址,类型为char (*)[2][3]
二维数组传参:
当定义了char a[2][3]={{1,3,9},{2,4,8}},如何将地址传入到函数中呢。函数对a数组进行修改呢。
void Func(int (*array)[10]); 注意*array需要用括号括起来。
这种形式的传参是1个指针,指向10个元素的数组,因为[]的优先级比*的优先级高,故*array必须用括号括起来。
#include "stdio.h"
void exchange(char (*p)[]); int main(int argc, char *argv[])
{
char a[][]={{,,},{,,}}; for(int i=; i<;i++)
for(int j=;j <;j++)
{
printf("a[%d][%d]=%d\n", i, j, a[i][j]);
}
printf("exchange\n");
exchange(&a[]);
for(int i=; i<;i++)
for(int j=;j <;j++)
{
printf("a[%d][%d]=%d\n", i, j, a[i][j]);
}
return ;
} void exchange(char (*p)[])
{
char tmp=(*p)[];
(*p)[] = (*p)[];
(*p)[] = tmp;
}
例子解析:exchange(&a[1])将{2,4,8}数组的首地址传递给exchange,exchange使用(*p)获得{2,4,8}的地址,然后用(*p)[0]、(*p)[1]、(*p)[2]偏移并修改{2,4,8}数组的值。
void Func(int *array[10]);
这种形式的传参是10元素的数组,每个元素都是指向int型的指针。
#include "stdio.h"
void exchange(char *p[]); int main(int argc, char *argv[])
{
char a[][]={{,,},{,,}}; for(int i=; i<;i++)
for(int j=;j <;j++)
{
printf("a[%d][%d]=%d\n", i, j, a[i][j]);
}
printf("exchange\n");
char *p[];
p[] = a[];
p[] = a[];
exchange(p);
for(int i=; i<;i++)
for(int j=;j <;j++)
{
printf("a[%d][%d]=%d\n", i, j, a[i][j]);
}
return ;
} void exchange(char *p[])
{
char tmp=p[][];
p[][] = p[][];
p[][] = tmp;
}
例子解析:先使用char *p[2]定义了2个元素的数组,每个元素都是char *型,然后将a[0]和a[1]的地址赋给p[0]和p[1],exchange函数接收到p[2]的地址,使用p[1]就能得到a[1]的地址,然后使用p[1][0]、p[1][1]、p[1][2]偏移到a[1][0]、a[1][1]、a[1][2]。
C语言之二维数组与指针的更多相关文章
-
C语言教学--二维数组和指针的理解
对于初学者对二维数组和指针的理解很模糊, 或者感觉很难理解, 其实我们和生活联系起来, 这一切都会变得清晰透彻. 我们用理解一维数组的思想来理解二维数组, 对于一维数组,每个箱子里存放的是具体的苹果, ...
-
关于c语言二维数组与指针的个人理解及处理办法。
相信大家在学习C语言时,对一维数组和指针的理解应该是自信的,但是,我在学习过程中,看到网上一些博文,发现即便是参加工作的一些专业编程人员,突然碰到二维数组和指针的问题时,也可能会遇到难以处理的诡异问题 ...
-
C语言 二维数组(指针)动态分配和释放(转)
C 二维数组(指针)动态分配和释放 先明确下概念: 所谓32位处理器就是一次只能处理32位,也就是4个字节的数据,而64位处理器一次就能处理64位,即8个字节的数据.如果我们将总长128位的指令分别按 ...
-
二维数组和指针(C语言)
二维数组和指针 二维数组和指针1.二维数组和数组元素的地址若有以下定义:int *p, a[3][4]; 1)二维数组a由若干个一维数组组成在C语言中定义的二维数组实际上是一个一维数组,这个一维数组的 ...
-
程序员之--C语言细节13(二维数组和指针,&;amp;*a[i][0]的理解,数组1[e]和e[1]非常可能你没见过)
主要内容:二维数组和指针.&*a[i][0]的理解.数组1[e]和e[1] #include <stdio.h> #define NUM_ROWS 10 #define NUM_C ...
-
c语言编程-----指向二维数组的指针
c中如何返回一个指向二维数组的指针 #include <stdio.h> #include <stdlib.h> #define COUNT 3 typedef int (*M ...
-
对二维数组使用指针进行操作的探索(C语言)
/* Name: 对二维数组使用指针进行操作的探索 Copyright: Author: lingr7 Date: 01/12/18 11:55 Description: */ #include< ...
-
c语言中双维数组与指针的那点事儿
说起c语言的指针,估计对c语言只是一知半解的同志们可能都会很头疼,尤其它跟数组又无耻的联系到一起的时候,就更加淫荡了!!! 怎么说呢,就是有一点规定:(或准则) 数组名可以看成是指向数组头元素的指针, ...
-
C/C++——二维数组与指针、指针数组、数组指针(行指针)、二级指针的用法
本文转载自:https://blog.csdn.net/qq_33573235/article/details/79530792 1. 二维数组和指针 要用指针处理二维数组,首先要解决从存储的角度对二 ...
随机推荐
-
JIT晚期(运行期)
在部分的商用虚拟机(Sun HotSpot.IBM J9)中,Java程序最初是通过解释器(Interpreter)进行解释执行的,当虚拟机发现某个方法或代码块的运行特别频繁时,就会把这些代码认定为& ...
-
canvas绘制直线和多边形基本操作
<!DOCTYPE HTML> <html lang="en"> <body> <canvas id="canvas" ...
-
在C语言中,double、long、unsigned、int、char类型数据所占字节数
和机器字长及编译器有关系: 所以,int,long int,short int的宽度都可能随编译器而异.但有几条铁定的原则(ANSI/ISO制订的): 1 sizeof(short int)<= ...
-
DIV+CSS 自适应布局
两栏布局,左边定宽200px,右边自适应.如何实现?我的第一个反应就是:用flex伸缩盒呀,然后balabala...说完之后,面试官说,还有没有别的方法?flex有些浏览器不支持嗯...我愣了一下, ...
-
C语言程序代写(QQ:928900200)
1.学生成绩统计 要求描述: 用结构数组实现学生信息的统计功能. struct student { long no; /*学号*/ char name[10]; /*姓名*/ char sex; /* ...
-
Debian Security Advisory(Debian安全报告) DSA-4407-1 xmltooling
Package : xmltooling CVE ID : CVE-2019-9628 Ross Geerlings发现xmltools库没有正确处理关于错误(畸形)XM ...
-
[UE4]Named Slot
用户创建的UI成为其他UI的子控件的时候,默认情况下是不能拥有子控件的,给UI添加一个Named Slot,这个UI就可以拥有子控件 一.创建一个名为testNameSlot的UI,添加3个Named ...
-
gitea 源码阅读笔记 002 生成无依赖单文件可执行包
gitea bindata static gitea 可以通过 make generate 生成一个单文件可执行程序, 该文件不需要任何其它依赖,直接可以单独执行. 对于用户的安装.升级和生成dock ...
-
UIDatePicker封装
#import <UIKit/UIKit.h> #import <objc/runtime.h> @protocol datePickerViewDelegate <NS ...
-
POJO/VO/DTO等对象模型
JavaBean 要想成为JavaBean,需要满足以下条件: 1,提供一个默认的无参构造函数. 2,需要被序列化并且实现了Serializable接口. 3,可能有一系列可读写属性伴随"g ...