数组
所谓数组,是有序的元素序列。 若将有限个类型相同的变量的集合命名,那么这个名称为数组名。组成数组的各个变量称为数组的分量,也称为数组的元素,有时也称为下标变量。用于区分数组的各个元素的数字编号称为下标。数组是在程序设计中,为了处理方便, 把具有相同类型的若干元素按无序的形式组织起来的一种形式。 这些无序排列的同类数据元素的集合称为数组。
数组的形式
一维数组
int a [10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10,}
int为类型名,a为数组名,[]则是数组长度,{}中的则是初值表.
二维数组
二维数组的赋初值方式有两种:
1.分行赋初值
int a [2] [3] = {{1, 2, 3},{4, 5, 6}}
2.顺序赋初值
int a [2] [3] = {1, 2, 3, 4, 5, 6}
[2]则指的是行长度,[3]则指的是列长度
二维数组的赋初值方式有两种:
一些注意点:
-
数组长度是一个常量
-
数组的下标不能越界,其合理取值范围是[0,数组长度-1],就如:上面一维数组中a[0]为1,...,a[9]为10
-
静态数组若没有初始化系统则会自动给所有的数组元素赋0
-
赋值时尽量不要省略数组长度
//顺序查找法 #include<stdio.h> int main(void) { int i, flag, x; int a [5]; printf("Enter 5 integers:"); for(i = 0; i < 5; i++) scanf("%d", &a[i]); printf("Enter x:"); scanf("%d", &x); //在数组a中查找x flag = 0; //先假设x不在数组a中,置flag为0 for(i = 0; i < 5; i++) if(a[i] == x) { //如果在数组a中找到了x printf("Index is %d ",i); //输出相应的下标 flag = 1; //置flag为1,说明在数组a中找到了x break; } if(flag == 0) //如果flag为0,说明x不在a中 printf("Not Found "); return 0; }
字符串
字符串常量就是用一对双引号括起来的字符序列,即一串字符,其拥有一个结束标志' ',将字符串存入字符数组时,数组长度至少是字符串的有效长度+1.
赋值和输入字符串
static char s [80];
s [0] = 'a';
s [1] = ' ';
"a"和'a'的区别
"a"是字符串常量,包括'a'和' ',用一维字符数组存放;'a'是字符常量,只有一个字符,可以赋值给字符变量。
指针
指针是编程语言中的一个对象,利用地址,它的值直接指向存在电脑存储器中另一个地方的值。由于通过地址能找到所需的变量单元,可以说,地址指向该变量单元。因此,将地址形象化的称为“指针”。意思是通过它能找到以它为地址的内存单元。
定以指针变量要使用指针声明符 ,定义指针变量的一般形式为:
类型名 *指针变量名
int i, *p;
指针变量要先赋值再使用,指针变量被赋的值应该是地址,例如:
int i, *p;
p = &i; //为存放变量i的地址
p = 0;
p = NULL; //3.4则说明了怎样把特殊值0赋给指针p,这时指针的值为NULL
p = (int *)1732 //此条语句中使用了强制转换来避免编译错误,表示p指向地址符为1732的int型变量
指针的基本运算
-
取地址运算和间接访问运算
单目运算符&用于给出变量的地址。例如:int *p, a = 3; p = &a;
用运算符&取变量a的地址,并将这个地址值作为指针p的值,使指针p指向变量a。
2. 赋值运算
指针被定义并赋值后就可以进行赋值运算。例如:
int a = 3; *p1, *p2;
p1 = &a;
p2 = p1;
将变量的地址赋给指针p1,再将p1的值赋给指针p2。
注意:
-
不能用数值作为指针变量的初值,但可以将一个指针变量初始化为一个空指针。
例如:int *p = 1000; //这样是错误的 int *p = 0; //这里的0是ASCII字符NULL的值
-
指针变量名是一个标识符
-
一般情况下一旦指针变量的类型被确定后,它只能指向同种类型的变量
-
不同类型的变量所占的内存空间不同,但不同类型指针变量所占的空间大小都是相同的
- 类型转换有两种:
- 自动类型转换
- 强制类型转换
使用强制类型转换运算符,可以将一个表达式转换成给定的类型。其一般形式为:
(类型名) 表达式
//指针和数组及储存单元
#include<stdio.h>
int main(void)
{
double a[2], *p, *q;
p = &a[0]; //指针p向数组a的首地址
q = p+1; //指针q指向数组元素a[1]
printf("%d
", q-p); //计算指针p和q之间的元素的个数
printf("%d
", (long long) q- (long long) p); //计算指针p和q之间的字节数
return 0;
}
指针与数组
指针名是个变量,数组名是一个常量
数组a是指针常量,不是变量,所以像a = p, a++, a+=2这样的表达式都是非法的,不能改变指针常量a的值。如果变量p是指向某个指定类型变量的指针,那么表达式p+1代表访问该类型的下一个变量的内存地址。比如:p+i ,p++ , p+=i这样的表达式是有意义的。
数组是一块内存连续的数据。指针是一个指向内存空间的变量。
指针+1指的是增加一个存储单元,数组+1后的地址指的是下一个元素的字节,而不是字节。
若想改变常量的值则将它赋给指针变量
#include<stdio.h>
int Bsearch (int *p, int n, int x); //函数声明
int main(void)
{
int a [10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; //有序数组
int x, m;
printf("Enter x:"); //提示输入
scanf("%d", &x);
m = Bsearch (a, 10, x);
if (m>=0)
printf("Index is %d
", m);
else
printf("Not Found
");
return 0;
}
int Bsearch (int *p, int n, int x) //二分查找函数
{
int low, high, mid;
low = 0; high = n-1; //开始时查找区间为整个数组
while (low <= high) { //循环条件
mid = (low+high)/2; //中间位置
if(x == p [mid])
break; //查找成功,终止循环
else if (x < p [mid])
high = mid-1; //前半段,high前移
else
low = mid+1; //后半段,low后移
}
if(low <= high)
return mid; //找到返回下标
else
return-1; ///找不到返回-1
}