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++,所以也不明白.今天在逛 ...
随机推荐
- MySQL Replication 详解MySQL数据库设置主从同步的方法
MySQL同步的流程大致如下: 1.主服务器(master)将变更事件(更新.删除.表结构改变等等)写入二进制日志(master log). 2.从服务器(slave)的IO线程从主服务器(binl ...
- DDA, Bresenham line's algorithm and Voxel Traversal used in the Grid-Accelerator in PBRT
- DDA(Digital Differential Analyzer, 数值微分法) - 计算机图形学中,经常会遇到一些计算机中”经典“的问题.例如,如何利用计算机”离散“的特质,模拟 ...
- 分享一个shell脚本的坑:grep匹配+wc取值 在脚本执行后的结果与手动执行结果不一致
打算在跳板机上写一个shell脚本,批量检查远程服务器上的main进程是否在健康运行中. 先找出其中一台远程机器,查看main进程运行情况 [root@two002 tmp]# ps -ef|grep ...
- Java源码阅读(不断补充)
java.util.LinkedList LinkedList是实现了List接口的双链表实现,拥有list的所有方法并且允许所有元素(包括null). 双向链表也叫双链表,是链表的一种,它的每个数据 ...
- POJ 2349 Arctic Network(最小生成树中第s大的边)
题目链接:http://poj.org/problem?id=2349 Description The Department of National Defence (DND) wishes to c ...
- ASP.NET MVC的ContentResult
ASP.NET MVC的ContentResult返回简单的纯文本内容,可通过ContentType属性指定应答文档类型,通过ContentEncoding属性指定应答文档的字符编码. 一个例子来演习 ...
- C# 将dll打包到程序中
本文告诉大家如何把 dll 打包到程序中.很多时候的 软件 在运行的时候需要包括很多 dll 或其他的文件,这样的软件在给其他小伙伴,就需要做一个压缩包,或者用安装软件.这样感觉不太好,所以本文告诉大 ...
- 安卓开发笔记①:利用高德地图API进行定位、开发电子围栏、天气预报、轨迹记录、搜索周边(位置)
高德地图开发时需要导入的包在下面的网盘链接中:(由于高德地图api更新得太快,官网上最新的包使用起来没有之前的方便,所以以下提供最全面的原始包) 链接:http://pan.baidu.com/s/1 ...
- [基础篇] 玄机网C#培训课程-初级.
课程目录 0x01第一课课前准备vs的选择与安装常用工具/网址 http://msdn.itellyou.cn/vs常用设置 0x02第二课C#的语法样式 编程风格VS的常用功能 俩个注意 ...
- webhttpbinding、basichttpbinding和wshttpbinding的区别
webhttpbinding是REST风格的绑定,您只需点击一个URL,然后从Web服务中获取大量XML或JSON. basichttpbinding和wshttpbinding是两个基于SOAP的绑 ...