一维数组
int arr[6]={1,2,3,4,5,6};//一维数组初始化
int array[6]={[5]=222};其他元素位置没有初始化,会被初始化为0
#include<stdio.h>
#define MONTHS 12
int main(void){
int day[MONTHS]={31,28,[4]=31,30,31,[1]=29};
int x[20];
int y;
for (int i = 0; i < MONTHS; i++)
{
printf("%2d %d\n",i+1,day[i]);
}
for(y = 0;y<20;y++){
x[y]=2*y;//给数组进行赋值
}
return 0;
}
多维数组
float xx [3][[4]={(1,2,3),(1,2,3),(1,2,3),(1,2,3)};
int yy[3][4][5];//三维数组也类似。
指针
指针是存放地址的变量
int *a;// 声明一个 int 类型的指针 a
char *a;// 声明一个char类型的指针 a
int *arr[10];// 声明一个指针数组,该数组有10个元素,每个元素都是指向Int类型的指针
int (*arr)[10];//声明一个数组指针,该指针指向一个Int类型的一维数组
int **a; // 声明一个指针a,该指针指向一个 int 类型的指针
struct Student *p_struct;//结构体类型的指针
int *x;
int y = 1;
x=&y;
x=(int *)mallco(sizeof(int)*n);//动态分配内存
相同类型的指针变量可以互相赋值。
空指针,是指向空,或者说不指向任何东西。x=NULL代表空指针情况。
*x代表x中存储的地址对应的存储单元中的数据.//1
#include<stdio.h>
int main(void){
int x = 1;
int *i= &x;//指向一个int类型的指针变量
char y = 'a';
char *u = &y;
printf("%d\n",sizeof(i));//64位系统指针大小8byte,并且固定
printf("%d\n",sizeof(u));//64位系统指针大小8byte,并且固定
printf("%p\n",&i);//000000000061FE08 指针本身的地址
printf("%p\n",&x);//000000000061FE14 指针存放的值
printf("%p\n",i);//000000000061FE14指针存放的值
printf("%p\n",i+1);//000000000061FE18 指针i+1=指针i+sizeof(指针类型)*1;
int arr[3]={1,5,3};
int *p;
p=arr;
/*
arr本身的地址,arr首元素的地址,以及arr本身地址是相同的
arr代表一个地址,并且是arr数组首元素的地址,
数组与指针不同点是:
数组名取地址得到的是数组名所指元素的地址。
对指针取地址得到的是指针变量自身的地址。
数组名就是一个指向数组首元素类型的常量指针,也就是说数组名是不允许更改的,而指针可以更改。
数组名是常量指针,指针是变量指针。
*/
printf("%p\n",arr);//000000000061FDF8
printf("%p\n",&arr[0]);//000000000061FDF8
printf("%p\n",&arr);//000000000061FDF8
/*当对数组名使用sizeof时,得到的是数组元素的个数乘元素类型的字节数,
对指针sizeof得到的是指针类型的字节数。
*/
printf("%d\n",sizeof(arr));//12 3*4
printf("%d\n",sizeof(i));//8 指针类型的字节数
/*
对arr取地址后加1后,增大了12个字节,而对指针p取地址后加一,
只增大了8个字节,所以说它们取地址后加一的能力不同。
*/
printf("%d\n",&arr);//6422008
printf("%d\n",&arr+1);//6422020
printf("%d\n",&i);//6422024
printf("%d\n",&i+1);//6422032
/*
总结:
1.数组名代表了一个指向数组首元素的常量指针,一经定义,不可更改,数组名作为常量指针,其类型与数组元素类型相同。指针是变量指针,定义之后仍可更改,其类型在定义时确定。
2.当出现sizeof,和&操作符时,数组名不再当成指向一个元素的常量指针来使用,而指针仍当成指向一个元素的变量指针来使用。
*/
/*
*(i+1)与*i+1
*/
printf("%d\n",*(p+1));//5 *(p+1)=arr[1]
printf("%d\n",*p+1);//2 *p+1=arr[0]+1
return 0;
}