所谓数组,是有序的元素序列。 若将有限个类型相同的变量的集合命名,那么这个名称为数组名。组成数组的各个变量称为数组的分量,也称为数组的元素,有时也称为下标变量。用于区分数组的各个元素的数字编号称为下标。数组是在程序设计中,为了处理方便, 把具有相同类型的若干元素按无序的形式组织起来的一种形式。 这些无序排列的同类数据元素的集合称为数组。
数组的形式
一维数组
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\n",i); //输出相应的下标 flag = 1; //置flag为1,说明在数组a中找到了x break; } if(flag == 0) //如果flag为0,说明x不在a中 printf("Not Found\n"); return 0; }字符串常量就是用一对双引号括起来的字符序列,即一串字符,其拥有一个结束标志'\0',将字符串存入字符数组时,数组长度至少是字符串的有效长度+1. 赋值和输入字符串
static char s [80]; s [0] = 'a'; s [1] = '\0';"a"和'a'的区别 "a"是字符串常量,包括'a'和'\0',用一维字符数组存放;'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。赋值运算 指针被定义并赋值后就可以进行赋值运算。例如:
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\n", q-p); //计算指针p和q之间的元素的个数 printf("%d\n", (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\n", m); else printf("Not Found\n"); 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 }转载于:https://www.cnblogs.com/muxixixixi/p/10292967.html