数组:由若干个相同类型的相关数据项按顺序存 储在一起,构成数组(array) ;数组实际上 是同种类型、有序的数据的集合。
数组名:如果用一个统一的名字标识这组数据, 那么这个名字就称为数组名
数组元素:构成数组的每一个数据项称为数组的 元素(element)
格式:类型 数组名[下标1][下标2] ……[下标n];
其中:类型为数组元素的基类型,即每个 元素的类型。下标值n表示为所在维的数组 元素个数,该维的数组下标的上界是n-1; C语言中数组下标下界始终为0。维数是 下标的个数。
一维数组的定义:类型 数组名[常数表达式];
例如:
int a[10]; //各元素都为整形。
定义一个包括10个整形元素的一维数组。 元素为:a[0]、a[1]、a[2] ……a[9]
C规定只能逐个引用数组元素, 而不能一次引用整个数组。
当数组被说明为静态(static)存储类型或外部存储类型(即在所有函数外部定义)时,则在不显式给出初值的情况下,数组元素将在程序编译阶段自动初始化为0。 static int a[4] 等价于 static int a[4]={0,0,0,0}
二维数组格式:类型 数组名[常数表达式1] [常数表达式2] ;
int a[3][4]; 可看成3行*4列矩阵
二维数组的排列顺序:
如果对全部元素赋初值(即提供全部初 始数据),则定义数据时对第一维长度可 以不指定,但第二维长度不能省。
int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12}; 等价于 int a[ ][4]={1,2,3,4,5,6,7,8,9,10,11,12};
今日代码演示:
#include<stdio.h>
#define N 10
int main()
{
int i,j;
int k=1;
int a[10][10];
for (int x = 0; x <=(N/2); x++)
{
for ( i = x; i < N-x; i++)
{
for ( j = x; j < N-x; j++)
{
a[i][j]=k;
}
}
k++;
}
for ( i = 0; i < N; i++)
{
for ( j = 0; j < N; j++)
{
printf("%d ",a[i][j]);
}
printf("\n");
}
}
运行结果:
数组名作为函数参数
传递方式:属于赋地址调用,将实参数组首地址 传给虚参,虚参也是一数组名
虚参要求:必须是数组名
实参要求:可为另一数组名。
哑实结合:哑实数组具有相同的首地址,即哑实 数组第一个元素占用同一存储单元, 以后各元素按顺序一一结合。
形参不可改变地址值。
若在被调函数中改变形参数组的元素值, 则实参数组中的元素值也会随之发生改变。 注意这种改变不是形参传给实参造成的(C 语言不允许这种反向的值传递),而是由于 形参和实参两个数组在内存中因指向同一地 址而共享同一段内存造成的。
选择D,以为每次都重新覆盖原值。
字符数组的定义:
字符数组可以整体操作 .但必须用特殊的函数static int a[]
数组名作形参的时候不会被视作数组而是指针
分配的不是数组空间是地址空间
数组作函数参数,只传首地址,不会传递数组大小
实参赋予给形参,形参不会影响实参,虚实结合的时候仅仅是把实参赋值给形参
被调函数中,形参数组的大小n实际上不起任何作用,只将实参的首地址传递给形参数组
形参数组是指针,形参和实参可以同名,但他们是两个不同的变量.函数空间不同,所以算不同变量
可改写为.不可以写成int *a
有效字符串。字符数组可以多个结束标志,字符串一个结束标志
字符串的输入:
scanf输入当遇到第一个空格的时候就要弹出
指针的概念:
1. 什么是变量的地址?
一个整数在32位系统中是占用4字节的,而返回的只是这4个字节的起始地址,它的全地址就是以这个地址开始的后面的4个字节. 而数组是相同类型的一组变量组成的,它们每个元素之间的地址是连续的 数组的名称本身就是表示这个数组的起始地址啦!再加上数组的类型的长度就是下一个元素的起始地址
什么是变量的内容?
变量的存的值
2. 什么是直接寻址?
通过变量名寻址
什么是间接寻址?
通过地址寻值
3. 取地址运算符&
去指针变量的地址
间接访问运算符*?
去地址里面的内容
为什么引入指针的概念
指针变量的定义:
指针变量必须先定义,后使用。
运算符*和++、--优先级等同,连续运算,采用右结合。下列各语句的含义如下: a=*p++ 先运算p++,但为后增运算,因而先将*p的值赋给a,然后p加1。 a=(*p)++ 先取*p的值,赋给a。然后将p所指向的变量内容加1。