文档章节

【C++11】再认识C语言中的指针与数组的区别

王选易
 王选易
发布于 2013/06/04 14:14
字数 1457
阅读 1082
收藏 25
点赞 1
评论 5

##指针与地址 p = &c把c的地址赋值给p,我们称p为指向c的指针。地址运算符只能作用于内存中的对象,即变量数组元素。即这样是合理的p = &c[0].

一元运算符*是间接寻址或间接引用运算符

ip一般代表的是指向int的指针,下面为ip的声明:

int *ip;

这样生命是为了记忆,该声明语局表明表达式*ip的结果时int类型。这种声明变量的语法与声明变量所在表达式的语法类似。同样的原因,对函数的声明也可以采用这种方法。例如:声明:

double *dp, atof(char *);

在表达式中,*dp和atof(s)的值都是double类型,且atof的参数是一个指向char类型的指针

我们应当注意,指针只能指向某种特定类型的对象,也就是说,每个指针都必须指向某种特定的数据类型。(但是void类型的指针可以存放指向任何类型的指针,但他不能间接引用自身)

*ip = *ip + 10;

*ip的值增加10 *和&的优先级最高

++*ip //等同 
*ip += 1

是将ip指向的对象的值加1

但是(*ip)++*ip++则不同,其中前者与上述代码同意,但后者则是对指针加1*和++这种运算符遵循从右到左的结合律。

最后,由于指针也是变量,所以在程序中可以直接使用,而不必通过间接引用的方法使用,

iq = ip;

讲吧ip的值拷贝到iq中,即iq也指向ip指向的对象。

##指针与数组

对数组元素a[i]的引用也可以写成*(a + i)的形式,C语言实际上就是这样转换后然后再进行求值,同理,&a[i], a+i也是等价的,a+i是a之后第i个元素的地址,如果pa是一个指针,也可以用pa[i]来取值。

但是,我们必须记住,数组名和指针有一个地方不同,指针是一个变量,因此在C中,语句p=apa++都是合法的。但数组名不是变量!

当数组名传递给一个函数时,实际上传的是该数组第一个元素的地址。在被调用函数中,该参数是一个局部变量, 因此,数组名参数必须是一个指针,也就是一个存储地址值的变量。

在函数定义中,形式参数:

char s[];

char *s;

是等价的。我们通常更习惯于后一种形式,因为他比前者更简洁明了表明了s是一个指针。如果将数组名传给函数,函数可以按照情况判定是按照数组处理还是按照指针处理,

##地址算术运算

指针与整数不能相互转换,但0是唯一的例外:常量0可以赋值给指针,指针也可以和常量0进行比较。程序中常用NULL代替9

p + n ;
p + sizeof(type℗) * n; // 等同

##字符指针与函数

字符串常量是一个字符数组,字符串常量最常见的用法是当做函数参数传递。

下面两个定义之间有很大的区别:

char amessage[] = "now is the time"	// 定义一个数组
char *pmessage = "now is the time"		// 定义一个指针

上述声明中,amessage是一个仅仅足以存放初始化字符串及空字符的一维数组,数组中单个字符可以修改,但amessage始终指向同一个存储位置。另一方面,pmessage是一个指针,其初值指向一个字符串常量,之后它可以被修改以指向其他地址,但如果试图修改字符串的内容,结果是没有定义的:

在此输入图片描述这图反了。。。大家尽量看

++与*搭配使用:

*p++ = val // 压栈
*--p = val // 出栈

##多维数组

如果二维数组作为参数传递给函数,那么在函数的参数声明中必须指明数组的列数,数组的行数则没有太大关系,因为前面已经讲过,函数参数传递的是一个指针,他指向由行向量组成的一维数组,其中每个行向量是13个整形元素构成的一维数组。在该例子中,传递给函数的是一个只想很多对象的指针,其中每个对象为13个整形元素构成的一维数组。

f(int (*daytab)[13]);
f(int daytab[][13]);
f(int daytab[2][13]);

这三种声明方式实际上是一致的。

第一种中,表示参数是一个指针,它指向具有13个元素的一维数组。因为方括号[]的优先级高于*的优先级,如果去掉括号,则变成:

f(int *daytab[13])

这相当于声明了一个数组,该数组有13个元素,其中每个元素都是一个指向整型的指针。

一般来说,除数组中的第一维可以不指定下标外,其他都必须指定下标。

##指针与多维数组

int a[10][20];	// 多维数组
int *b[10];		// 指针数组

指针数组的一个重要优点在于,数组的每一行的长度可以不同,也就是说,b的每个元素不必都指向一个具有20个元素的向量,某些元素可以指向2个元素的向量。

指针数组的最常用的领域是存放不同长度的字符串

char *name[] = {…};	// 指针数组
char name[][15];	// 二维数组

© 著作权归作者所有

共有 人打赏支持
王选易
粉丝 86
博文 20
码字总数 20066
作品 3
南京
程序员
加载中

评论(5)

x
xsong
这样生命是为了记忆, 生命 --> 声明
Floyd_W
Floyd_W
其实感觉数组名挺好玩的。你看啊,比如声明一个int a[100][100];
a 和 *a 的值是一样一样的,但是**a就不一样啦。。为什么对同一个地址进行*操作会不同呢?我也不懂。
Dyllian
Dyllian

引用来自“王选易”的评论

引用来自“Dyllian”的评论

总结的不错,但文中不够仔细,有几个编辑错误哦

是字写错了吗。。。谢谢鼓励

是的,写完自己再审核一遍就ok了
王选易
王选易

引用来自“Dyllian”的评论

总结的不错,但文中不够仔细,有几个编辑错误哦

是字写错了吗。。。谢谢鼓励
Dyllian
Dyllian
总结的不错,但文中不够仔细,有几个编辑错误哦
指针变量的认识、看法

1. 指针变量也只是普通的变量 很多C语言的初学者都将指针变量看的很神秘,实际上,就像其他的普通变量(比如int类型的),指针变量也是一种普通变量,他具有其他变量的一切特征。 例如: in...

长平狐 ⋅ 2012/09/03 ⋅ 0

C语言编程学习程序解析:C语言的指针和函数返回值解析

C语言是面向过程的,而C++是面向对象的 C和C++的区别: C是一个结构化语言,它的重点在于算法和数据结构。C程序的设计首要考虑的是如何通过一个过程,对输入(或环境条件)进行运算处理得到...

小辰带你看世界 ⋅ 05/27 ⋅ 0

C语言指针讲解(三)

谨记 哎,我......觉得你变了,我怎么变了?你以前是那么的听话,那么的在乎我,总是想象美好的生活而奋斗,遇到困难不断的去尝试克服,生活的态度总是那样积极向上的。而如今的你,变得总是...

长风留言 ⋅ 2017/11/14 ⋅ 0

2675字带你进阶C语言中的关键字.md

C语言进阶之C语言关键字 关键字总结.png 基本数据类型 1.数据类型 数据类型可以理解为固定内存大小的别名(例如,在C语言中int数据类型代表了4个字节的内存) 数据类型是可以创建变量的模板...

PcDack ⋅ 2017/12/03 ⋅ 0

C语言中指针与数组之异同

前段时间面试的时候有一个问题涉及到了数组与指针的区别,发现自己在潜意识中把数组名和指针等同起来了。而事实上数组与指针确实是不同的,被问及二者区别的时候,我就只能含糊地说数组含有长...

Lwxxx ⋅ 2012/10/30 ⋅ 0

C语言编程学习程序解析:数据类型和函数返回值解析

C语言是面向过程的,而C++是面向对象的 C和C++的区别: C是一个结构化语言,它的重点在于算法和数据结构。C程序的设计首要考虑的是如何通过一个过程,对输入(或环境条件)进行运算处理得到...

小辰带你看世界 ⋅ 05/27 ⋅ 0

NDK开发中这些基本知识你都懂吗

JNIEnv 定义: 相当于一个jni上下文对象。 作用: 通过JNIEnv的指针能够对Java端的代码进行操作: a.创建Java对象. jstring str = (env).NewStringUTF("终端研发部"); jclass jclazz = (env)...

codeGoogle ⋅ 2017/09/21 ⋅ 0

const static在c c++中的作用

一.C语言中的const const是C语言中保留的一个关键字,它用来限定一个变量是只读的,即不可变的。程序中使用const可以在一定程度上提高程序的健壮性,但是程序中使用过多的const,可能在对代码...

y_x ⋅ 2011/11/17 ⋅ 0

数组指针和指针数组的区别

数组指针和指针数组的区别 数组指针(也称行指针) 定义 int (*p)[n]; ()优先级高,首先说明p是一个指针,指向一个整型的一维数组,这个一维数组的长度是n,也可以说是p的步长。也就是说执行...

超级极客 ⋅ 2016/12/05 ⋅ 0

2017.12.02.C语言总结

指针变量 指针可以引出几个概念,指针变量,指针数组,数组指针。那么什么是指针呢,通过什么来进行指针的计算? 首先我们要知道有关指针的符号; 指针运算符 (1)取地址运算符& 取地址运算符...

ti_tail ⋅ 2017/12/04 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

熊掌号收录比例对于网站原创数据排名的影响[图]

从去年下半年开始,我在写博客了,因为我觉得业余写写博客也还是很不错的,但是从2017年下半年开始,百度已经推出了原创保护功能和熊掌号平台,为此,我也提交了不少以前的老数据,而这些历史...

原创小博客 ⋅ 21分钟前 ⋅ 0

LVM讲解、磁盘故障小案例

LVM LVM就是动态卷管理,可以将多个硬盘和硬盘分区做成一个逻辑卷,并把这个逻辑卷作为一个整体来统一管理,动态对分区进行扩缩空间大小,安全快捷方便管理。 1.新建分区,更改类型为8e 即L...

蛋黄Yolks ⋅ 39分钟前 ⋅ 0

Hadoop Yarn调度器的选择和使用

一、引言 Yarn在Hadoop的生态系统中担任了资源管理和任务调度的角色。在讨论其构造器之前先简单了解一下Yarn的架构。 上图是Yarn的基本架构,其中ResourceManager是整个架构的核心组件,它负...

p柯西 ⋅ 50分钟前 ⋅ 0

uWSGI + Django @ Ubuntu

创建 Django App Project 创建后, 可以看到路径下有一个wsgi.py的问题 uWSGI运行 直接命令行运行 利用如下命令, 可直接访问 uwsgi --http :8080 --wsgi-file dj/wsgi.py 配置文件 & 运行 [u...

袁祾 ⋅ 今天 ⋅ 0

JVM堆的理解

在JVM中,我们经常提到的就是堆了,堆确实很重要,其实,除了堆之外,还有几个重要的模块,看下图: 大 多数情况下,我们并不需要关心JVM的底层,但是如果了解它的话,对于我们系统调优是非常...

不羁之后 ⋅ 昨天 ⋅ 0

推荐:并发情况下:Java HashMap 形成死循环的原因

在淘宝内网里看到同事发了贴说了一个CPU被100%的线上故障,并且这个事发生了很多次,原因是在Java语言在并发情况下使用HashMap造成Race Condition,从而导致死循环。这个事情我4、5年前也经历...

码代码的小司机 ⋅ 昨天 ⋅ 1

聊聊spring cloud gateway的RetryGatewayFilter

序 本文主要研究一下spring cloud gateway的RetryGatewayFilter GatewayAutoConfiguration spring-cloud-gateway-core-2.0.0.RC2-sources.jar!/org/springframework/cloud/gateway/config/G......

go4it ⋅ 昨天 ⋅ 0

创建新用户和授予MySQL中的权限教程

导读 MySQL是一个开源数据库管理软件,可帮助用户存储,组织和以后检索数据。 它有多种选项来授予特定用户在表和数据库中的细微的权限 - 本教程将简要介绍一些选项。 如何创建新用户 在MySQL...

问题终结者 ⋅ 昨天 ⋅ 0

android -------- 颜色的半透明效果配置

最近有朋友问我 Android 背景颜色的半透明效果配置,我网上看资料,总结了一下, 开发中也是常常遇到的,所以来写篇博客 常用的颜色值格式有: RGB ARGB RRGGBB AARRGGBB 这4种 透明度 透明度...

切切歆语 ⋅ 昨天 ⋅ 0

CentOS开机启动subversion

建立自启动脚本: vim /etc/init.d/subversion 输入如下内容: #!/bin/bash## subversion startup script for the server## chkconfig: 2345 90 10# description: start the subve......

随风而飘 ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部