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语言,这个语言最强大的就是它强大的函数式编程( ...
随机推荐
- Swift ARC 自动引用计数
1.ARC 引用类型在堆上的内存分配过程中有 8 字节的地址长度用来保存对象的引用计数,堆上的内存并不像栈上那样立即进行回收,系统会定时对堆上的内存进行检查,当某个实例不再被使用时,引用计数会变为 0 ...
- SNF快速开发平台MVC-EasyQuery-拖拽生成SQL脚本
在之前介绍一下EasyQuery工具SNF开发平台WinForm-EasyQuery统计分析-效果-非常牛逼的报表查询工具 Winform开发框架之图表报表在线设计器-报表-SNF.EasyQuery ...
- [docker]使用quaaga实现(rip ospf)实现主机间容器互通
使用quaaga实现(rip ospf)实现主机间容器互通 - n1设置 brctl addbr br0 ip a a 10.1.1.1/24 br0 ip a a 10.1.1.1/24 dev b ...
- --save与--save-dev的区别
--save安装的包会在生产和开发环境中都使用: --save-dev的包只在开发环境中使用,在生产环境中就不需要这个包了,不再打包:
- Paypal Rest Api自定义物流地址(跳过填写物流地址)
PayPal之前的Rest Api是不支持自定义物流地址的,最新升级版本的提供了这个服务(Payment Experience),大概步骤如下: 1.申请一个自定义的配置ID 自定义配置包括Logo, ...
- Android Things:树莓派3上手就是这么简单
http://blog.csdn.net/p106786860/article/details/54566620 ——————————————————————————————————————————— ...
- 关于指针*前后const代表的意思——记住一个口诀“左内右本”
记住一个口诀“左内右本”:const出现在*的左边,则说明指针所指向的内容是常量const出现在*的右边,则说明指针本身是常量如果*左右两边都出现const,那么说明指针本事是常量,它所指向的内容也是 ...
- 学习Mysql过程中拓展的其他技术栈:Docker入门介绍
一.Docker的介绍和安装 1. Docker是什么 百度百科的介绍: Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linu ...
- Java如何使服务器允许连接到套接字端口?
在Java编程中,如何使服务器允许连接到套接字端口? 以下示例显示如何使服务器通过使用ServerSocket类的server.accept()方法和Socket类的sock.getInetAddre ...
- Java中的引用类型Scanner类和随机类型Random
Scanner类 我们要学的Scanner类是属于引用数据类型,我们先了解下引用数据类型. 引用数据类型的使用 与定义基本数据类型变量不同,引用数据类型的变量定义及赋值有一个相对固定的步骤或格式. ...