一、数组
1.数组初始化:
1.1.创立数组的时候初始化,像这样:
int array[5] = {1,2,3,4,5};
int array[5] = {1,2,3};//此时array[3],array[4]都会被编译器初始化为0
int array[2] = {1,2,3};//此事3的值便会被舍去
int array[5] = {0};//全部初始化为0
int array[] = {1,3,4...}//这样便不用担心出错了
int array[] = {1,2,3...};
int i = sizeof array / sizeof array[0];
//i便是array数组所包含的元素多少了
1.2.使用for循环:
int array[5];
for(i=0;i<5;i++)
{
array[i]=i;
}
1.3.但这样是错的:
int array1[5],array2[5];
array1[5]={1,2,3,4,5};//此时array1[5]是一个超出数组下标的元素,属于语法错误。
array2=array1;//C不允许这个操作,不要想着自己操作了,doge
1.4.指定初始化:
int array[5] = {[4] = 5};//将array[4]初始化为5,同样,其它未初始时化的元素为0
int array[8] = {1,2,[4]=3,4,5,[1]=6};
for (i=0;i<8;i++)
{
printf("%2d %d\n",i+1,array[i]);
}
//打印结果:1 6
2 2
3 0
4 3
5 4
6 5
7 0
8 0 1.指定元素后面的值会排在指定元素后
2.前面的值会被后面的指定元素替代
1.5.奇怪的下标不可取:
int array[-1];//不行,数组大小必须大于0
int array[1.5];//不行,数组大小必须是整数
int array[(int)1.5];//可以,已经被强制初始化了
int m = 2;
int array[3];
int array[m] = 3;//C99之前不允许,现在阔以
2.多维数组
2.1.初始化多唯数组:其实就是大数组里面住着小数组
int array[2][2] = { {1,2},{3,4} };//2个包含两个元素的元素
int array[2][2] = { {1,2,3},{4,5} };//第一个元素初始化有问题,但不影响第二个元素
int array[2][2] = {1,2,3,4,5};//如果是这样,被丢的就是5
二.数组与指针
1.数组、指针:
1.1.数组的首地址:
int array[5];
array = &array[0];//数组名就是数组的首地址,两者都是常量
1.2.指针对于数组地址的移动:
1.2.1.不同变量类型
#define SIZE 5
int *ptr,*poi;
short array1[SIZE];
double array2[SIZE]
*ptr = array1;
*poi = array2;
printf("%2d %d",ptr,ptr+1);
//结果:0x7fff5fbff8dc 0x7fff5fbff8de 加的是一个short
printf("%2d %d",poi,poi+1);
//结果:0x7fff5fbff8a0 0x7fff5fbff8a8 加的是一个double
//指针加一指的是增加一个元素的储存单元,所以指针不仅需要地址,还需要类型
1.2.2.运算优先级:
#define SIZE 5
int *ptr;
short array[S1ZE];
ptr = array;
*(ptr+1) == &array[1]
*ptr+1 == array[0]+1 //因为*的优先级高于+
2.函数、数组、指针:
2.1指针的初始化
int array[5];
int *p=array;//直接将array首地址赋值给p
int *p;
p = array;//也行,不能用*p,因为*p是对p指针解引用了,而p未初始化1
2.1函数对指针的调用:
函数原型可以省略原型,但函数定义不能省略
int fun(int *ar, int n)
int fun(int ar[], int n)
//关于函数的形参,仅在函数原型或者函数定义中,才可以用int ar[]替代int *ar
//这里ar[]也是指向实参数组的指针
C保证在给数组分配空间时,指向数组后面的第一个位置的指针任是有效指针
int sump(int *start,int *end)
{
int total=0;
while(start<end)
{
total += *start;
start++;
}
return total;
}
const *p不可改变它指向的值,但数组本身可以改变值,它自身也可以指向别处
#define M 5
const int *p;
int ar[M];
int rt[M];
p = ar;
*p = 8;//无效
ar[M] = 8;//有效
p = rt;//有效
const数组不可以赋值给普通指针
#define M 5
const int ar[M];
int *p;
p = ar;//无效