数组:包含了同一类型的多个数据元素的集合 eg:int a[5] 表明定义了一个数组,其包含5个int型的数据
指针:在程序中声明一个变量并使用地址作为该变量的值,那么这个变量就是指针变量 eg:int *p 变量p是指向int型变量的指针
数组的概念:
int arr[5]={} 表示定义了一个int型数组,其数组名是arr,数组长度是5
int arr[5]={0}; 表示定义了一个int型数组,其数组名是arr,数组长度是5,arr[0]的值初始化为0
int arr[5]={1,2}; 表示定义了一个int型数组,其数组名是arr,数组长度是5,arr[0]=1,arr[2]=2
int arr[]={1,2}; 表示定义了一个int型数组,其数组名是arr,该数组默认长度为2
数组下标:数组元素的引用要指定下标,一般形式为数组名[下标],下标的取值范围为(0,数组长度-1)
数组的使用 利用for循环进行初始化
#include<stdio.h>
int main()
{
int arr[5];
for(int i=0;i<5;i++) //注意:数组下标要从0开始
{
arr[i]=i;
printf("%d ",arr[i]);
}
return 0;
}
一维数组名:有两种情况代表整个数组
1. sizeof(arr):代表整个数组的字节长度
eg: int arr[5];
int len=sizeof(arr)/sizeof(arr[0]);//数组的长度(sizeof(arr)=20,sizeof(arr[0])=4,len=20/4=5)
2.&arr+1(跳到数组的末尾后的位置)
数组越界访问=访问非法地址(哨兵位)(会报错)
#include<stdio.h>
int main()
{
int a=10;
int a1=20;
int arr[5]={0,1,2,3,4};
printf("%d\n",&a);
printf("%d\n",&a1);
printf("%d\n",&arr[0]);
printf("%d\n",&arr[4]);
return 0;
}//输出结果为
15728352
15728340
15728312
15728328
此时变量是以栈的形式进出的(栈;后进先出)
arr[1] *(arr+1)的区别
#include<stdio.h>
int main()
{
int arr[5]={1,2,3,4,5};
printf("%d\n",arr[1]);//输出下标为1的元素
printf("%d\n",*(arr+1));//输出第二个地址所指向的内容
return 0;
}
指针的运用
#include<stdio.h>
int main()
{
int a=10;
int *p=&a;
printf("%d\n",*p);// //指针p指向了a的地址,此时*p所指向的内容为a的值,所以输出结果为10(解引用,*是间接引用符)
*p=100;
printf("%d\n",*p); //*p所指向的内容被重新赋值为100,所以输出结果为100
return 0;
}
定义功能函数时 int Fun(int arr[ ];int len) 等价于int Fun(int*arr,int len)
arr数组名相当于数组元素的首地址
任何指针的大小都是4个字节
#include<stdio.h>
int main()
{
int a=10;
int *p=&a;
printf("%d\n",sizeof(p));//求int型指针p的字节大小,结果为4
char ch='a';
char *t=&ch;
printf("%d\n",sizeof(t));//求char型指针t的字节大小,结果为4
return 0;
}
野指针
int *p;//*p没有初始化,会出现报错 预防野指针的一种方法:int *p=NULL;
*p=30;
printf("%d",*p);
//交换两个数的功能函数
#include<stdio.h>
void Fun(int *p1,int *p2)
{
int temp=*p1;
*p1=*p2;
*p2=temp;
}
int main()
{
int a=10,b=20;
Fun(&a,&b);
printf("%d %d",a,b);
return 0;
}