C语言复习3/24

1.一维数组与指针

int a[10];
int *p = a;

a[i] <=>*(a+i)<=>*(p+i)

a作为一维数组的数组名,它的值是固定的。当数组名用作函数参数时,形参数组名是作为指针变量来处理的。如果用指针变量作实参,必须先使指针变量有确定值,指向一个已定义的对象。

2.二维数组与指针

定义一个二维数组int a[3][4];

从二维数组角度看,a代表二维数组首元素的地址,现在的首元素不再是一个简单的整型元素,而是由4个整型元素所组成的一维数组,因此,a代表的是首行的首地址,a + 1代表序号为1的行的首地址。如果二维数组的首行地址是2000,一个整型数据占4个字节,则a + 1的值应该是2000 + 4*4 = 2016。a[0],a[1],a[2]既然是一维数组名,而C语言又规定了数组名代表数组首元素的地址,因此a[0]代表一维数组a[0]中第0列元素的地址,即&a[0][0]。a[i][j]=*(a[i] + j)=*(*(a + i) + j)。如果a是一维数组名,则a[i]代表a数组序号为i的元素的存储单元。a[i]是有物理地址的,是占存储单元的。但如果a是二维数组,则a[i]是一维数组名,它只是一个地址,并不代表某一元素的值(如同一维数组名只是一个指针常量一样)。a + 1和*(a + 1)的值都是2016,但是含义是不同的,a + 1是1行首地址,*(a + 1)等价于a[1],代表的是1行0列元素a[1][0]的地址。

二维数组名是指向行的,一维数组名是指向列的。在指向行的指针前面加一个*,就转换为指向列的指针。例如,a和a + 1是指向行的指针,在它们前面加一个*就是*a和*(a+1),它们就成为指向列的指针,分别指向a数组0行0列元素和1行0列的元素。反之,在指向列的指针前面加&,就成为指向行的指针。例如a[0]是指向0行0列元素的指针,在它前面加一个&就成为&a[0],由于a[0]与*(a+0)等价,因此&a[0]与&*a等价,也就是与a等价,它指向二维数组的0行。不要把&a[i]简单的理解为a[i]元素的物理地址,因为并不存在a[i]这样一个实际的数据存储单元。它只是一种地址的计算方法,能得到第i行的首地址,&a[i]和a[i]的值是一样的,但它们的含义是不同的。&a[i]或a+i指向行,a[i]或*(a + i)指向列。

int a[3][4] = { {1,2,3,4},{1,2,3,4},{1,3,4,4} };
int (*p)[4]; //定义p为一个指针变量,指向包含4个整型元素的一维数组
p = a;
printf("%d", *(*(p + 1) + 2));

3.

时间: 2024-11-16 18:35:56

C语言复习3/24的相关文章

C语言复习(一)关键字

最近在学COCOS2Dx,刚刚开始写一个塔防游戏,因为第一次用VS2012,感觉还不太习惯. C语言的大部分内容也忘记了,因此做一个简要的复习. 1.关键字: auto break case char const continue default do double else enum extern float for goto if int long register return short signed sizeof static struct switch typedef unsigne

C语言复习:文件操作

文件操作专题 C语言文件读写概念 文件分类 按文件的逻辑结构: 记录文件:由具有一定结构的记录组成(定长和不定长) 流式文件:由一个个字符(字节)数据顺序组成 按存储介质: 普通文件:存储介质文件(磁盘.磁带等) 设备文件:非存储介质(键盘.显示器.打印机等) 按数据的组织形式: 文本文件: ASCII文件,每个字节存放一个字符的ASCII码 二进制文件:数据按其在内存中的存储形式原样存放 每个文件都以文件名为标识,I/O设备的文件名是系统定义的,如: COM1或AUX--第一串行口,附加设备

cpp学习(二)C语言复习

接下来复习一下C语言部分,毕竟C++与C语言本自同根生,并且在汇编层面C与C++可以说完全相同.假如你没有C语言基础的话,可以先暂停去学习一下C语言,C语言可以看"C语言之父"谭浩强的<C语言程序设计>或者观看学堂在线的免费公开课,在此推荐清华大学的c++课程:http://www.xuetangx.com/courses/course-v1:TsinghuaX+00740043X_2015_T2+sp/courseware/a0f3bf5a4c044dfaaad68148

C语言复习3/6日

1.变量:变量代表一个有名字的.具有特定属性的一个存储单元.它用来存放数据,也就是存放变量的值.在程序运行期间,变量的值是可以改变的.变量必须先定义后使用.变量名和变量值是两个不同的概念.变量名实际上是以一个名字代表的一个存储地址.在对程序编译连接时由编译系统给每一个变量名分配对应的存储地址.从变量中取值,实际上是通过变量名找到对应的内存地址,从该存储单元中读取数据. 2.符号常量:用#define指令,指定用一个符号名称代表一个常量.如#define  PI  3.14 注意:符号常量不是变量

c语言复习 —— 数组

数组的产生:数据是一种存放数据的容器.所以:一个数组中里面的元素是同一种类型的. 一维数组: 1.定义: 类型 名称 [元素数量] 注意:元素数量必须是整数,c语言中没有对象这个概念,所以存放的都是基本的数据类型,而在oc中的数组中存放的是必须是对象. 在c99之前,元素数量必须子编译的时候定义下来,而c99之后,确实可以没有没有定义下来. eg: int[10];//表示定了10个元素的数组,为整数类型. 2.特点: 1)所有的元素都是具有相同的类型. 2)一旦创建,就不能够更改. 3)数组中

简单链表-C语言复习

实现一个基本的链表,包括在链表后添加数据节点和输出链表i所有数据的功能 1 #include<stdio.h> 2 #include<stdlib.h> 3 4 typedef struct node 5 { 6 int data; 7 struct node *link; 8 }NODE; 9 10 //定义头指针 11 NODE *head; 12 13 void add(int data) 14 { 15 16 NODE *p; 17 p=(NODE *)malloc(siz

C语言复习3/9

1.C语言中定义数组的形式为:类型符  数组名[常量表达式],常量表达式中可以包括常量和符号常量,如"int a[3+5];"是合法的.不能包含变量,如"int a[n];"是不合法的.也就是说,C语言不允许对数组的大小作动态定义,即数组的大小不依赖于程序运行过程中变量的值.如果在被调用的函数(不包括主函数)中定义数组,其长度可以是变量或非常量表达式.如: void func(int n) { int a[2 * n]; //合法,n的值从实参传来 . . . }

C语言复习

函数里面不能嵌套函数  这两个的区别是什么呢 #define a int[10] 属于宏定义,在编译的时候只进行替换,而不进行类型检查:typedef int a[10]: 只不过给int型取个别名,在编译的时候会进行类型检查. typedef 类型 别名;                  类型别名    用这个 #define 名字 替换成的字符          宏定义   只是把一个你写的东西替换成另一种东西,比如#define Hello "hello",把Hello替换成&

C语言复习——指针 链表 与 文件操作

刚刚进入大二,准备开始学习C++,对大一所学的C语言一次练习,正好也是赶上老师布置的任务,用C语言写一个  销售管理系统  ,就尽可能的把所学的都用上,也就是结构,指针,文件操作,还有数据结构,本次加入了链表. 用两个函数 Load_LinkList() 和 Save_LinkList() 让链表与文件操作结合,除了打印函数,其他都是在内存中操作链表,这样写更有条理,在创建链表时没有采用书上的用一个中间变量引导,并插入到结点前面,而是直接在链表尾的next申请内存,便于理解,操作也方便. /*首