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语言中的数组与指针的更多相关文章

  1. C语言中的数组和指针以及字符串

    数组名同时也是该数组首元素的地址,而指针提供了一种用来使用地址的符号方法,因此指针能够很有效地处理数组. 将一个整数加给指针,这个整数会和指针所指类型的字节数相乘,然后所得的结果会加到初始地址上 da ...

  2. 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 ...

  3. go语言中的数组切片:特立独行的可变数组

    go语言中的数组切片:特立独行的可变数组 初看go语言中的slice,觉得是可变数组的一种很不错的实现,直接在语言语法的层面支持,操作方面比起java中的ArrayList方便了许多.但是在使用了一段 ...

  4. 【VS开发】【编程开发】【C/C++开发】结构体中的数组与指针的内存分配情况说明

    [VS开发][编程开发][C/C++开发]结构体中的数组与指针的内存分配情况说明 标签:[VS开发] [编程开发] 主要是疑惑在结构体定义的数组的内存空间与指针动态分配的内存空间,在地址上连续性.以及 ...

  5. Go语言中底层数组和切片的关系以及数组扩容规则

    Go语言中底层数组和切片的关系以及数组扩容规则 demo package main import ( "fmt" ) func main() { // 声明一个底层数组,长度为10 ...

  6. C语言核心之数组和指针详解

    指针 相信大家对下面的代码不陌生: int i=2; int *p; p=&i;这是最简单的指针应用,也是最基本的用法.再来熟悉一下什么是指针:首先指针是一个变量,它保存的并不是平常的数据,而 ...

  7. C语言学习004:数组与指针

    在C语言中,字符串实际上就是字符数组,在内存中字符串"Shatner"存储的形式是这样的

  8. 关于c语言二维数组与指针的个人理解及处理办法。

    相信大家在学习C语言时,对一维数组和指针的理解应该是自信的,但是,我在学习过程中,看到网上一些博文,发现即便是参加工作的一些专业编程人员,突然碰到二维数组和指针的问题时,也可能会遇到难以处理的诡异问题 ...

  9. C语言中动态分配数组

    如何动态的定义及使用数组呢?记得一般用数组的时候都是先指定大小的.当时问老师,老师说是不可以的.后来又问了一位教C++的老师,他告诉我在C++里用new可以做到,一直不用C++,所以也不明白.今天在逛 ...

随机推荐

  1. Python后端相关技术/工具栈

    编辑器 最常见: vim / SublimeText2 / PyCharm Vim有兴趣可以看看 k-vim 适合Python/Golang开发 本地环境 pip/easy_install 包管理 v ...

  2. SOA,Webservice,SOAP,REST,RPC,RMI的区别与联系

    SOA,Webservice,SOAP,REST,RPC,RMI的区别与联系 SOA面向服务的软件架构(Service Oriented Architecture) 是一种计算机软件的设计模式,主要应 ...

  3. 使用Unicode字符实现换行

    要让inline元素换行可以使用Unicode字符实现: <!DOCTYPE html> <html lang="en"> <head> < ...

  4. git第一节----git config配置

    @查看git的版本 git --version @查看git配置信息 git config --list config list分全局和局部,在根目录下执行git config --list显示为全局 ...

  5. UML类图示例

  6. es6学习笔记1

    最近在阅读<探索es6>,就把自己认为重要的做一点笔记,方便日后学习. 1.获取更多的es6资源的办法 有两组 ES6 资源: “ ECMAScript 6 Tools ”,作者 Addy ...

  7. Mac 自带的Apache php 狼神的

    开启服务:sudo /usr/sbin/apachectl start 停止服务:sudo /usr/sbin/apachectl stop 重启服务:sudo /usr/sbin/apachectl ...

  8. (转).net平台下垃圾回收机制

    引言:使用c++进行编程,内存的处理绝对是让每个程序设计者最头疼的一块了.但是对于.net平台下使用c#语言开发系统,内存管理可以说已经不算是问题了.在.net平台下CLR负责管理内存,CLR中的垃圾 ...

  9. 整数对(hdu1271)找规律

    整数对 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submissio ...

  10. Vue: ES6常用语法

    ES6 模板字符串:  ~ ${变量名}~ <div id="app"></div> <script> /* 找到对应id */ let ite ...