博客
关于我
指针与数组、函数
阅读量:386 次
发布时间:2019-03-05

本文共 2076 字,大约阅读时间需要 6 分钟。

《c primer plus 》阅读笔记

一、指针表示法和数组表示法:
1.指针表示法和数组表示法优缺
使用数组表示法,让函数是处理数组的这一意图更加明显。另外,许多其他语言的程序员对数组表示法更熟悉,如FORTRAN、Pascal、Modula-2或BASIC。其他程序员可能更习惯使用指针表示法,觉得使用指针更自然。
至于C语言,ar[i]和*(ar+1)这两个表达式是等价的。无论ar是数组名还是指针变量,这两个表达式都没有问题。但是,只有当ar是指针变量时,才能使用ar++这样的表达式。
指针表示法(尤其与递增运算符一起使用时)更接近机器语言,因此一些编译器在编译是、时能生成效率更高的代码。然而,许多程序员认为他们的主要任务是确保代码正确、逻辑清晰,而代码优化应该留给编译器去做。(以上内容《c primer plus》原文(p294))

2.用指针表示法表示一维数组:

int * p;
声明了一个指向int类型的指针,其实他与声明了一个数组内似。
可以使用 * (p+i)=count(指针加1表示增加一个存储单元)对地址上存储的数据进行赋值。使用*(p+i)和使用a[i]的效果等同。
用指针表示法表示数组时,指针加1表示系统给他多分配一个存储单元,他可以多存储一个数据。而数组本身则是先分配存储空间,然后在相应的地址上存储数据(不包括变长数组和动态分配,可以说,使用指针表示数组在一定程度上达到了前者的功能)
下面看一看使用指针表示法的例子:

#include
int main(void){ int *p,i,n; scanf("%d\n",&n); for(i=0;i

输出如下:

在这里插入图片描述
2.声明一维数组形参
int sum(int *ar,int n)//传递给改函数一个地址和一个变量
int sum(int ar[],int n)//传递给该函数一个数组首地址(数组名)和一个变量
3.使用指针形参
指针的第一个基本用法是在函数间传递信息。如果希望在被调函数中改变主调函数的变量,就必须使用指针。指针的第二个基本用法是用在处理数组的函数中。
int sum(int *str,int *end)//可以分别传递一个数组的开始处地址和结束处地址。
二.指针和二(多)维数组

  1. 先介绍二维数组:
    int a[3][4];
    二维数组既数组的数组,主数组有3个元素,每个元素是内含4个元素的数组。
    a是数组首元素的地址,所以a的值和&a[0]相同,而a[0]本身是一个内含四个int类型值的数组的首地址,所以a[0]的值和&a[0][0]相同:
#include
int main(void){ int a[3][4]; printf("%p\n%p\n%p",a,a[0],&a[0[0]);}

输出如下:

在这里插入图片描述
这一点体现了指针的复杂性,要记住a是地址的地址,必须解引用两次才能获得原始值。地址的地址或指针的指针就是双重间接的例子。
a[1][1]等价的指针表示法是* (* (a+1)+1),下面列出理解该表达试的思路:

a//二维数组首元素的地址(每个元素都是内含四个int类型元素的一维数组)

a+1//二维数组第2个元素(既一维数组)的地址

*(a+1)//二维数组的第2个元素(既一维数组)的首元素(一个int类型的值)地址

*(a+1)+1//二维数组的第2个元素(既一维数组)的第二个元素(也是一个int类型的值)地址

*( * (a+1)+1)//二维数组的第2个元素(既一维数组)的第2个元素的值

注意 * a+1和 * ( * a+1)的意义,前者中*a表示a的第二个元素(一个二维数组)首地址,加1表示第二个元素的第二个元素的地址(一个int类型的值)其他的解引用方式应该举一反三。

2.使用指针的指针(二级指针)表示二维数组

二级指针:如果一个指针指向的是另外一个指针,我们就称它为二级指针,或者指向指针的指针。注意:二级指针和二维数组本身关系不大 。

int **a;    a=(int**)malloc(sizeof(int*)*m);      for(i=0;i

创建了一个m*n的二维数组,与a[m][n]等效。3.声明指向二维数组的指针

int a[3][4];
int (*b)[4];
b=a;
为什么是int (*b)[4]而不是int *b?
因为把指针声明为指向int的类型还不够。因为指向int只能与a[0]的类型匹配,说明该指针指向一个int类型的值。但是 a是它首元素的地址,该元素是一个内含四个int类型值的一维数组。因此,b必须指向一个内含四个int类型值的数组,而不是指向一个int类型的值。
4.二维数组与函数
声明二维数组形参:
void sum(int a[][len],int row)//len不能省略
void sum(int (*b)[len],int row)//len不能省略

转载地址:http://liqwz.baihongyu.com/

你可能感兴趣的文章
Nginx配置限流,技能拉满!
查看>>
Nginx面试三连问:Nginx如何工作?负载均衡策略有哪些?如何限流?
查看>>
Nginx:NginxConfig可视化配置工具安装
查看>>
ngModelController
查看>>
ngrok | 内网穿透,支持 HTTPS、国内访问、静态域名
查看>>
ngrok内网穿透可以实现资源共享吗?快解析更加简洁
查看>>
NHibernate学习[1]
查看>>
NHibernate异常:No persister for的解决办法
查看>>
NIFI1.21.0_java.net.SocketException:_Too many open files 打开的文件太多_实际操作---大数据之Nifi工作笔记0051
查看>>
NIFI1.21.0_Mysql到Mysql增量CDC同步中_日期类型_以及null数据同步处理补充---大数据之Nifi工作笔记0057
查看>>
NIFI1.21.0_Mysql到Mysql增量CDC同步中_补充_更新时如果目标表中不存在记录就改为插入数据_Postgresql_Hbase也适用---大数据之Nifi工作笔记0059
查看>>
NIFI1.21.0_NIFI和hadoop蹦了_200G集群磁盘又满了_Jps看不到进程了_Unable to write in /tmp. Aborting----大数据之Nifi工作笔记0052
查看>>
NIFI1.21.0最新版本安装_连接phoenix_单机版_Https登录_什么都没改换了最新版本的NIFI可以连接了_气人_实现插入数据到Hbase_实际操作---大数据之Nifi工作笔记0050
查看>>
NIFI1.21.0通过Postgresql11的CDC逻辑复制槽实现_指定表多表增量同步_增删改数据分发及删除数据实时同步_通过分页解决变更记录过大问题_02----大数据之Nifi工作笔记0054
查看>>
NIFI1.21.0通过Postgresql11的CDC逻辑复制槽实现_指定表多表增量同步_插入修改删除增量数据实时同步_通过分页解决变更记录过大问题_01----大数据之Nifi工作笔记0053
查看>>
NIFI1.21.0通过Postgresql11的CDC逻辑复制槽实现_指定表或全表增量同步_实现指定整库同步_或指定数据表同步配置_04---大数据之Nifi工作笔记0056
查看>>
NIFI1.23.2_最新版_性能优化通用_技巧积累_使用NIFI表达式过滤表_随时更新---大数据之Nifi工作笔记0063
查看>>
NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_根据binlog实现数据实时delete同步_实际操作04---大数据之Nifi工作笔记0043
查看>>
NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_配置binlog_使用处理器抓取binlog数据_实际操作01---大数据之Nifi工作笔记0040
查看>>
NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_配置数据路由_实现数据插入数据到目标数据库_实际操作03---大数据之Nifi工作笔记0042
查看>>