C语言中的数组与指针
1、 数组的初始化
数组的初始化方法有很多,常用的方法有
定义时初始化 int arr[]={,,}; 或 int arr[]={}; //未初始化的元素全为0;
定义后遍历赋值初始化
int arr[3];
for(int i=0;i<3;i++)
arr[i]=i;
C99之后,出现了另一种十分方便的初始化方式。即利用元素位置来初始化该元素,使用方法如下 int arr[]={[]=,}
初始化后的结果 arr[]={,,,,}
此种方式的缺点是,后面的初始化后覆盖前面的初始化,即同一个初始化语句,最终的结果决定于靠后的语句。例如 arr[]={,,,,[]=); 最后的结果是 arr[]={,,,,}
2、数组作为函数参数
数组作为函数参数的用法,是将数组名作为参数传递。因为数组名是数组的首元素的地址,所以这种方式传递的实际上是指向数组首字母的指针。此时,使用指针和数组名作为参数功能等价。
在函数的声明部分,以下四种声明方式等价:
int fun(int []);
int fun(int arr[]);
int fun(int *);
int fun(int *arr);
而在函数定义部分,由于不能省略参数,所以,上面的2,4两种方式等价。
因为数组作为函数参数传递的是指针,所以在函数中对数组做改变会影响到原数组的值,为避免这种情况(即在我们不希望函数对数组的值进行改变的时候),我们可以采用下面的函数定义方式
int fun(const int arr[]);
用这种方是定义的函数会把指针定义为指向常量的指针,任何在函数内部试图对原数组的至进行改变的操作都会被编译器阻止。
3、其他一些指针小知识
指向常量的指针在上面的函数参数部分已经谈到了,即 const int *p; 定义了一个指向常量的指针,用这种方式定义的指针可以指向常量和普通变量,且不会改变指向对象的值。(普通指针不能指向常量 )
指针复制给指针时,有一点需要注意,虽然将普通指针赋值给常量指针是允许的,但这有一个前提,即只能进行一层间接运算,下面演示了如果允许两层间接运算带来的危险。
const int n=;
int *p1;
const int * p2;
const int **p3;
p1=p2; //非法,将const指针赋值给普通指针
p2=p1; //合法,将普通指针赋值给const指针
p3=&p1; //非法,将const指针赋值给普通指针,如果假设允许,看下会发生什么
*p3=&n; //合法,const指针指向const,但p1指向n,即普通指针指向const值
*p1=; //合法,p1为普通指针,可以改变指向的变量值,后果是常量n的值改变
声明指向3个int值的指针的方法: int (*p)[]; (*的运算优先级低于[],所以如果不加()会声明为指针数组。)这时p相当于于 int arr[][]; 中的arr、&arr[1],指向了三个int型变量组成的数组。
C语言中的数组与指针的更多相关文章
- C语言中的数组和指针以及字符串
数组名同时也是该数组首元素的地址,而指针提供了一种用来使用地址的符号方法,因此指针能够很有效地处理数组. 将一个整数加给指针,这个整数会和指针所指类型的字节数相乘,然后所得的结果会加到初始地址上 da ...
- Go 语言中的数组是一种 值类型(不像 C/C++ 中是指向首元素的指针)
the-way-to-go_ZH_CN/07.1.md at master · Unknwon/the-way-to-go_ZH_CN https://github.com/Unknwon/the-w ...
- go语言中的数组切片:特立独行的可变数组
go语言中的数组切片:特立独行的可变数组 初看go语言中的slice,觉得是可变数组的一种很不错的实现,直接在语言语法的层面支持,操作方面比起java中的ArrayList方便了许多.但是在使用了一段 ...
- 【VS开发】【编程开发】【C/C++开发】结构体中的数组与指针的内存分配情况说明
[VS开发][编程开发][C/C++开发]结构体中的数组与指针的内存分配情况说明 标签:[VS开发] [编程开发] 主要是疑惑在结构体定义的数组的内存空间与指针动态分配的内存空间,在地址上连续性.以及 ...
- Go语言中底层数组和切片的关系以及数组扩容规则
Go语言中底层数组和切片的关系以及数组扩容规则 demo package main import ( "fmt" ) func main() { // 声明一个底层数组,长度为10 ...
- C语言核心之数组和指针详解
指针 相信大家对下面的代码不陌生: int i=2; int *p; p=&i;这是最简单的指针应用,也是最基本的用法.再来熟悉一下什么是指针:首先指针是一个变量,它保存的并不是平常的数据,而 ...
- C语言学习004:数组与指针
在C语言中,字符串实际上就是字符数组,在内存中字符串"Shatner"存储的形式是这样的
- 关于c语言二维数组与指针的个人理解及处理办法。
相信大家在学习C语言时,对一维数组和指针的理解应该是自信的,但是,我在学习过程中,看到网上一些博文,发现即便是参加工作的一些专业编程人员,突然碰到二维数组和指针的问题时,也可能会遇到难以处理的诡异问题 ...
- C语言中动态分配数组
如何动态的定义及使用数组呢?记得一般用数组的时候都是先指定大小的.当时问老师,老师说是不可以的.后来又问了一位教C++的老师,他告诉我在C++里用new可以做到,一直不用C++,所以也不明白.今天在逛 ...
随机推荐
- 使用Unicode字符实现换行
要让inline元素换行可以使用Unicode字符实现: <!DOCTYPE html> <html lang="en"> <head> < ...
- 邂逅jQuery
jQuery是一个流行的JavaScript库,提供了HTML操作,CSS操作,事件,动画,Ajax和常用插件,极大地简化了JavaScript的开发. 可以从jquery.com下载jQuery库, ...
- Quartz2D绘制路径
// 在画线的时候,方法的内部默认创建一个path.它把路径都放到了path里面去. // 1.创建路径 cgmutablepathref 调用该方法相当于创建了一个路径,这个路径用来保存绘图信息. ...
- c++/c 获取cpp文件行号跟文件名
编译器内置宏: 先介绍几个编译器内置的宏定义,这些宏定义不仅可以帮助我们完成跨平台的源码编写,灵活使用也可以巧妙地帮我们输出非常有用的调试信息. ANSI C标准中有几个标准预定义宏(也是常用的): ...
- TRIZ解决问题方法
个人觉的成功是有规律的,那些成功的人士,都有一套处理事情的秘籍.只要我们的思维方式把那些秘籍融会贯通,并快速执行,我们有一天也会成功的. TRIZ解决问题的5点方法. 1.确定最终目标. 2.列出阻碍 ...
- Git(二)_基本命令
0. 开始查看所有配置:git config --listgit config --global user.name "runoob"git config --global use ...
- <mvc:annotation-driven /> 作用
<mvc:annotation-driven /> 是一种简写形式,完全可以手动配置替代这种简写形式,简写形式可以让初学都快速应用默认配置方案.<mvc:annotation-dri ...
- Linux 安装mysql,mariadb,mysql主从同步
myariadb安装 centos7 mariadb的学习 在企业里面,多半不会使用阿里云的mariadb版本,因为版本太低,安全性太低,公司会配置myariadb官方的yum仓库 1.手动创建mar ...
- django-sql注入攻击
一.原理 什么是sql注入 所谓SQL注入就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串(注入本质上就是把输入的字符串变成可执行的程序语句),最终达到欺骗服务器执行恶意的SQ ...
- CSS十大选择器
CSS十大选择器: 1.id选择器 # 2.class选择器 句号 . 3.标签选择器 标签名称 4.相邻选择器 加号 + 5.后代选择器 空格 6.子元素选择器 大于号 > 7.多元素 ...