C语言之二维数组与指针
二维数组:
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(二维数组和指针,&*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. 二维数组和指针 要用指针处理二维数组,首先要解决从存储的角度对二 ...
随机推荐
- 动态流程图关于jointJs的使用
这段时间由于业务需要,需要展现动态的流程图.具体实现效果如图所示: jointJS中的线条以及框都是依赖SVG进行的二次开发.建议初学者先学习svg里相关属性,便于在阅读jointJs的API或者de ...
- KendoUi 学习笔记(二) Grid
Kendo.ui.Grid Kendo Ui Grid控件,继承至Widget. 一.构造 allowCopy Boolen|Object (默认:false) 当他设置true, ...
- 第一次靶场练习:SQL注入(1)
SQL注入1 本文章目的是对相关的黑客内容进一步了解,如有人违反相关的法律法规,本人概不负责 一.学习目的: 利用手工注入网站 利用sqlmab注入 二.附件说明 靶场网址:http://117.41 ...
- oracle 表空间不足处理
linux环境将*.dmp文件导入数据库时,df -h 发现测试环境虚拟机空间不足,而数据文件xxx.dbf所占空间达到40G左右,果断删除表空间重建在导入. 一.查出存储数据表空间名称 selec ...
- win7安装python3.6.1及scrapy
---恢复内容开始--- 第一篇博客,记录自己自学python的过程及问题. 首先下载python3.6.1及所需资料 百度云:https://pan.baidu.com/s/1geOEp6z 密码: ...
- Hadoop学习------Hadoop安装方式之(一):单机部署
Hadoop 默认模式为单机(非分布式模式),无需进行其他配置即可运行.非分布式即单 Java 进程,方便进行调试. 1.创建用户 1.1创建hadoop用户组和用户 一般我们不会经常使用root用户 ...
- 怎样检测TCP/UDP端口的连通性
1 TCP端口的连通性 TC端口的连通性,一般通过telnet检测: TCP协议是面向连接的,可以直接通过telnet命令连接 telnet host-ip port 2 UDP端口的连通性 因为公司 ...
- Map、Set、List区别
转:https://www.cnblogs.com/jing99/p/6947549.html 提到集合之前,先说说数组Array和集合的区别: (1)数组是大小固定的,并且同一个数组只能存放类型 ...
- asp.net,根据gridview 中checkbox复选框选中的行对数据库进行操作
在asp.net中,使用checkbox,对gridview添加复选框. 多选数据行后,根据已选数据,对原数据进行多条语句查询. string sql = "Select * from 表 ...
- Ubuntu下useradd与adduser区别
Ubuntu下useradd与adduser有所不同 1.useradd在使用该命令创建用户是不会在/home下自动创建与用户名同名的用户目录,而且不会自动选择shell版本,也没有设置密码,那么这个 ...