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 **
10.指针兼容性较差,不同类型的指针不能相互转换。
  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 在不同编译环境不同。
11.变长数组,在 c99增添了变长数组,也就是允许出现 临时变量、变量来初始化数组, 1 int a=10, 2 b=5; 3 double ss[a][b]; 这种属性在某些函数具有数组形参 定义的情况下,可以提高函数的容纳性,也就是一个函数就可接受各种长度的数组,但是以前的指针也可以实现。该属性在c11中被保留,但是需要开启才能用。
12.复合字面量,int diva[2]={10,20};(int [2]){10,20}//复合字面量  该种类型主要用于初始化 指向数组的指针,初始化要一气呵成。 int * pt1; pt1=(int [2]){10,20};
13.一个指向字符串的指针ss,ss[1]=’1’;//? 这样会导致什么问题呢?  由于编译器的优化,将导致 不管你定义多少字符串 “hello world !”,如果该字符串倍多次引用,但是编译器为了节省内存(flash),将用一个字符串代替所有出现改字符串的位置(也就是不管谁用,都将调用同一个内存位置的同一个字符串)。这时候如果你更改了 ss[1]=’a’;那么即便后面出现的 printf(“hello world”);//将会打印出 hallo world ! 有些编译器的行为将变得难以捉摸,程序甚至崩溃。所以键入你要使用 指针指向字符串,那么请使用const修订符。
14.字符串数组:
  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的更多相关文章

  1. go语言笔记——数组长度不可变,但是元素值是可变的!!!

    数组声明的格式是: var identifier [len]type 例如: var arr1 [5]int 在内存中的结构是: 对索引项为 i 的数组元素赋值可以这么操作:arr[i] = valu ...

  2. c语言笔记 数组2

    15. c99以前一直使用 gets 和 puts来输入输出字符串,但是gets因为无法获知内存大小,容易出现内存溢出(对此c99对gets,采取保留态势,c11直接废除,但是某些编译器仍然默认可以使 ...

  3. C语言笔记 06_作用域&数组

    作用域 任何一种编程中,作用域是程序中定义的变量所存在的区域,超过该区域变量就不能被访问.C 语言中有三个地方可以声明变量: 在函数或块内部的局部变量 在所有函数外部的全局变量 在形式参数的函数参数定 ...

  4. Go 语言笔记

    Go 语言笔记 基本概念 综述 Go 语言将静态语言的安全性和高效性与动态语言的易开发性进行有机结合,达到完美平衡. 设计者通过 goroutine 这种轻量级线程的概念来实现这个目标,然后通过 ch ...

  5. 013-结构体-C语言笔记

    013-结构体-C语言笔记 学习目录 1.[掌握]返回指针的函数 2.[掌握]指向函数的指针 3.[掌握]结构体的声明 4.[掌握]结构体与数组 5.[掌握]结构体与指针 6.[掌握]结构体的嵌套 7 ...

  6. 011-指针(上)-C语言笔记

    011-指针(上)-C语言笔记 学习目标 1.[掌握]字符串常用函数 2.[掌握]指针变量的声明 3.[掌握]指针变量的初始化 4.[掌握]函数与指针 5.[掌握]指针的数据类型 6.[掌握]多级指针 ...

  7. 010-字符串-C语言笔记

    010-字符串-C语言笔记 学习目标 1.[掌握]二维数组的声明和初始化 2.[掌握]遍历二维数组 3.[掌握]二维数组在内存中的存储 4.[掌握]二维数组与函数 5.[掌握]字符串 一.二维数组的声 ...

  8. 009-数组-C语言笔记

    009-数组-C语言笔记 学习目标 1.[掌握]数组的声明 2.[掌握]数组元素的赋值和调用 3.[掌握]数组的初始化 4.[掌握]数组的遍历 5.[掌握]数组在内存中的存储 6.[掌握]数组长度计算 ...

  9. Scala语言笔记 - 第三篇(容器方法篇)

    Scala语言笔记 - 第三篇(容器方法篇) 目录 Scala语言笔记 - 第三篇(容器方法篇) map和flapMap方法: ​ 最近研究了下scala语言,这个语言最强大的就是它强大的函数式编程( ...

随机推荐

  1. Linux内核剖析(一)Linux的历史

    Unix操作系统 Unix的由来 汤普逊和里奇最早是在贝尔实验室开发Unix的,此后的10年,Unix在学术机构和大型企业中得到了广泛的应用,当时的UNIX拥有者AT&T公司以低廉甚至免费的许 ...

  2. SNF开发平台WinForm-表单验证控件-通用

    CS程序也能做到像BS程序一样的验证效果,如下: 1.验证控件的展示 校验时如果不符合验证条件的控件,会在控件上显示较显眼的图标. 当出现不符合验证的控件时,鼠标悬浮会显示自定义的提示信息. 如:输入 ...

  3. Activity标题(title)的显示和隐藏

    开发Android应用程序,我们总会遇到Activity的title把显示的内容遮挡了一部分.如果能把它去掉,我们的应用界面就会变得更加简洁,那该多好.下面有两种方法可以去掉: (方法一):通过一句J ...

  4. eclipse开发android入门学习

    1.device窗体            查看android执行情况的窗体和DDMS内容一致 2.android.bat             在adb路径下执行adb操作,实现android系统 ...

  5. [DIOCP视频]-DIOCPFileServer视频

    本次视频简单讲解了DiocpFileServer + 客户端使用接口方式,通信方面可以方便的在DiocpBlockTcpClient和IdTcpClient组件之间切换. + 添加单独的EXE客户端( ...

  6. 【Android】Android输入子系统

    成鹏致远 | lcw.cnblogs.com | 2013-10-25 Linux输入子系统回顾 1:为什么要回顾linux输入子系统?这个问题后面自然就知道了 1.linux输入子系统设备是基于平台 ...

  7. plsql常用方法-转

    在SQLPLUS下,实现中-英字符集转换alter session set nls_language='AMERICAN';alter session set nls_language='SIMPLI ...

  8. PI SQL 语句

    insert [piarchive]..[picomp2](tag,time,value) values('ppnie_test','t',100) INSERT into pipoint..clas ...

  9. Docker 基本指令整理(一)

    安装Docker yum install docker 1   1 yum install docker 开机自启动 -- centos 6 service docker start chkconfi ...

  10. Java8学习笔记(二)--三个预定义函数接口

    三个函数接口概述 JDK预定义了很多函数接口以避免用户重复定义.最典型的是Function: @FunctionalInterface public interface Function<T, ...