c 语言笔记 数组1
1.数组可以有多维数组。c99支持动态数组,c11和c99之前不再支持。
2.数组 初始化一个后,后面的自动初始化为0,如果不初始化,都是垃圾值。
3.数组初始化 可以指定 ss[10]={0,2,3,[2]=3,};。通过[x]可以指定x位置数组初始化,如果该位置已经初始化,将被替换。
4.对于指针的理解。指针非常简单易用。指针有类型,比如char int long float 等,这是指指针指向的数据是char int long等,而指针本身是一种全新的类型,不在普通类型范围内。比如printf要使用 %p来显示指针地址。定义一个指针 char *p; *与p之间可以保持一个空格,也可以紧挨着。使用中我们经常使用 char a=0; p=&a; 将a的物理内存地址赋值给 p指针内,我们可以把指针比作一个存放其他数据内存地址的容器(碗?)。* p 的*指的是地址翻译器(间接运算符),它可以将p指针内指向的数据翻译出来。
5.对于指针指向数组,ss[10]={0};p=ss; p == ss[0] 也就是说 等同于指向数组第一个数据位置ss[0]的地址。
6.*(p+1),*(p+2),*(p+3),指的是什么? +1 +2 +3并不是指内存地址 +1 +2 +3,而是指 指向的数据 +1 +2 +3,如果是char型数据,代表着移动1 2 3个char型数据,如果是int指针,代表着移动1 2 3个int数据地址,这就是为什么指针还有类型,是为了方便准确的翻译数据与地址的关系。这种用法有直接 p++ ; p+=x;等直接改变指针的做法,还有*(p+x)等做法,各有优点。
7.指针的优势,c语言里面,非常灵活的应用于函数内改变数据,因为传递到函数的实际的物理内存地址,所以函数内能够抓取到传递的数据的真身,在内存中修改它。而普通形参传递的只是临时数据转换,并不能改变原有的数据。当然数组、结构体也是与内存实际相关的,他们在内存中是依次顺序排列的,这就为一些神奇操作创造了条件,比如快速的格式化一组结构体,寄存器,数据结构等等,也就是说指针操作对象是真实的内存,与机器更接近一点。(其他高等语言可能没有,可能不一样,另外对于有mmu内存管理单元的cpu来说,c语言操作的却是存在于镜像之上的虚拟实际内存地址)
8.const 指针可以指向非const 和 普通数据,非const的数据赋值给普通指针。形参可使用const修饰,既可以保护数据,又可以同时处理 const和非 const数据。
9.指针和数组的关系,a[] 和普通指针很相似,操作一维数组和操作普通指针没有太大区别。char (* pz)[2] ptr是一个指向一个数组的指针,这个数组里面包含两个 char数据.
1 char ss[4][2]={{2,4},{6,8},{1,3},{5,7},};
2 ss[0][0]=2;
3 * ss[0]=2;
4 *(*ss+1)[0]=6;
5 **ss=2;
6 *(*(ss+2)+1)=3;
7 pz=ss;
8 *(*pz+1)=6;
9 pz[0][0]=2;
10 *pz[0]=2;
11 **
1 典型例子:
2 int * pt;
3 int(*pa)[3];
4 int ar2[3][2];
5 pa=ar2;
6 p2=&pt;
7 *p2 = ar2[0]; //有效*pa和ar2[0]都是指向整数的指针。
8 p2 =ar2;//无效 p2指向指针的地址 ar2指向数组的指针。
9 --把非const指针赋值给const指针是不安全的,会有警告,执行这样的代码是无效的,你可能会试图更改const指针指向地址的数据,但这是无效的,改地址不允许被改变。
10
11 典型例子;
12 const int **pp2;
13 int *p1;
14 const int n=13;
15 pp2=&p1;//非const指针赋值给const,会有警告,不能通过*pp2修改它所指向的内容。
16 *pp2 = &n;//有效,两者都是const,但是试图通过 *pp2来改变它所指向内容是不允许的 *pp2所指向的是指针p1,试图将改变p1指针内容
17 *p1=10;//有效但是 n得知不会改变,编译的结果也不可信,可能是10 可能是13 在不同编译环境不同。
1 const char * ss[5]={ //其实指的是 ss内部有五个 指针 也就是常说的面试题 定义一个有x个指针的数组
2 //特点 占用字节少 系统共占用 5x8=40字节 (指针占用 8个字节?) 其中字符串字面量倍储存在静态变量(对于嵌入式系统,存储在flash里面)。字符串不一定连续储存在内存中
3 "adding number",
4 "adding number",
5 "adding number",
6 "adding number",
7 "adding number",
8 }
9
10 char ss[5][20]={ //这个是包含五个字符串的数组和二维数组一样
11 //前面说过,c系统为了节省资源,整个程序出现的字符串,都将使用一个代替,数组有点不同,数组使用副本,就是重新copy一份,这样就是会占用两份资源。另外字符串分配资源利用率也很低,不管用没有,
//每个字符串将被分配20个字节。几个字符串连续储存在内存中
12 "adding number",
13 "adding number",
14 "adding number",
15 "adding number",
16 "adding number",
18 }
对比:使用指针字符串不能更改 对于字符串要一直更改的场合请使用字符串数组。
c 语言笔记 数组1的更多相关文章
- go语言笔记——数组长度不可变,但是元素值是可变的!!!
数组声明的格式是: var identifier [len]type 例如: var arr1 [5]int 在内存中的结构是: 对索引项为 i 的数组元素赋值可以这么操作:arr[i] = valu ...
- c语言笔记 数组2
15. c99以前一直使用 gets 和 puts来输入输出字符串,但是gets因为无法获知内存大小,容易出现内存溢出(对此c99对gets,采取保留态势,c11直接废除,但是某些编译器仍然默认可以使 ...
- C语言笔记 06_作用域&数组
作用域 任何一种编程中,作用域是程序中定义的变量所存在的区域,超过该区域变量就不能被访问.C 语言中有三个地方可以声明变量: 在函数或块内部的局部变量 在所有函数外部的全局变量 在形式参数的函数参数定 ...
- Go 语言笔记
Go 语言笔记 基本概念 综述 Go 语言将静态语言的安全性和高效性与动态语言的易开发性进行有机结合,达到完美平衡. 设计者通过 goroutine 这种轻量级线程的概念来实现这个目标,然后通过 ch ...
- 013-结构体-C语言笔记
013-结构体-C语言笔记 学习目录 1.[掌握]返回指针的函数 2.[掌握]指向函数的指针 3.[掌握]结构体的声明 4.[掌握]结构体与数组 5.[掌握]结构体与指针 6.[掌握]结构体的嵌套 7 ...
- 011-指针(上)-C语言笔记
011-指针(上)-C语言笔记 学习目标 1.[掌握]字符串常用函数 2.[掌握]指针变量的声明 3.[掌握]指针变量的初始化 4.[掌握]函数与指针 5.[掌握]指针的数据类型 6.[掌握]多级指针 ...
- 010-字符串-C语言笔记
010-字符串-C语言笔记 学习目标 1.[掌握]二维数组的声明和初始化 2.[掌握]遍历二维数组 3.[掌握]二维数组在内存中的存储 4.[掌握]二维数组与函数 5.[掌握]字符串 一.二维数组的声 ...
- 009-数组-C语言笔记
009-数组-C语言笔记 学习目标 1.[掌握]数组的声明 2.[掌握]数组元素的赋值和调用 3.[掌握]数组的初始化 4.[掌握]数组的遍历 5.[掌握]数组在内存中的存储 6.[掌握]数组长度计算 ...
- Scala语言笔记 - 第三篇(容器方法篇)
Scala语言笔记 - 第三篇(容器方法篇) 目录 Scala语言笔记 - 第三篇(容器方法篇) map和flapMap方法: 最近研究了下scala语言,这个语言最强大的就是它强大的函数式编程( ...
随机推荐
- Python 隔离沙箱 virtualenv
我认为Python一个很大的优势就是官方网站给出的众多的软件包,几乎能帮助你实现你想要的任何功能,避免了重复开发的劳动,但是零零碎碎的包,以及每个包的各种各样的版本管理就成为了一个比较棘手的问题,因此 ...
- SNF快速开发平台MVC-EasyUI3.9之-ueditor富文本编辑在 asp.net MVC下使用步骤
mvc项目中用到了这个富文本编辑就试着把遇到的问题个使用步骤在这里记录一下,希望大家少走弯路. 1.首先我们先下载net版本的uediot 2.然后把整个文档拷贝到我们的项目中,记得是整个 把下载的文 ...
- Atitit 手机图片备份解决方案attilax总结
Atitit 手机图片备份解决方案attilax总结 1.1. 图片分类 相机图片与app图片1 1.2. 增量备份,只能使用按照时间法备份..1 1.3. 备份工具选型1 1.4. App图片,只好 ...
- linux每日命令(13):more命令
more命令,功能类似 cat ,cat命令是整个文件的内容从上到下显示在屏幕上. more会以一页一页的显示方便使用者逐页阅读,而最基本的指令就是按空白键(space)就往下一页显示,按 b 键就会 ...
- 为11.2.0.2 Grid Infrastructure添加节点
转自:http://www.askmaclean.com/archives/add-node-to-11-2-0-2-grid-infrastructure.html 在之前的文章中我介绍了为10g ...
- Viewing the interface of your Swift code,查看Swift代码的头文件的三种方法
Technical Q&A QA1914 Viewing the interface of your Swift code Q: How do I view the interface ...
- java 中使用log4j
一.控制台使用 1.导入log4j包到工程中 2.配置: log4j.rootLogger=DEBUG,console,R log4j.appender.console=org.apache.log4 ...
- AndroidStudio2.2 Preview3中NDK开发之CMake和传统 JNI在目录结构和配置文件上的区别(转载)
自从AndroidStudio更新到2.2,就有了CMake和传统JNI两种开发NDK的方法,主要就是在目录结构和build.gradle上的区别,下面我们将分别介绍目录区别和build.gradle ...
- c++ 动态判断基类指针指向的子类类型(typeid)
我们在程序中定义了一个基类,该基类有n个子类,为了方便,我们经常定义一个基类的指针数组,数组中的每一项指向都指向一个子类,那么在程序中我们如何判断这些基类指针是指向哪个子类呢? 本文提供了两种方法 ( ...
- VS2012+openCV 2.4.8进行编译:VS2012 64位 使用OPENCV应用程序不能正常启动 (0xc000007b)怎么处理?
[OpenCV入门教程之一] 安装OpenCV:OpenCV 2.4.8 +VS 开发环境配置 http://blog.csdn.net/poem_qianmo/article/details/198 ...