1.指针概念
(1)指针:地址(房间号),通过地址找到内存单元
(2)指针变量:存放在指针中的变量被当成地址处理,类型:int*
int a =20;
int* p=&a; //P是指针变量,存放的是a的地址
*p=a; (3)指针和指针类型
指针的大小在32位平台是4字节,在64位平台是8字节
(4)指针类型决定了指针访问空间的大小
- int* p; *p能够访问4个字节
- char* p; *p能够访问1个字节
- double* p; *p能够访问8个字节
(5)指针+-整数
指针类型决定了:指针走一步能够走多远(指针的步长)
int arr[10]={0};//arr[10]共开辟了40字节
int* p=arr;//arr[10]的首元素的地址赋给p
int i=0;
for(i=0;i<10;i++)
{
*(p+1)=1;//走一步是四个字节
}
int arr[10]={0};
char* p=arr;
int i=0;
for(i=0;i<10;i++)
{
*(p+1)=1;//p走一步是1个字节
} 数组arr[ 10 ]是int类型的,共占有40个字节
int* p走一步是4个字节,循环十次,走40个字节,所以可以把数组中的10个元素全部修改为1;char*p走一步是1个字节,循环十次,走10个字节,只能修改数组中的2.5个元素,且arr[2]既不是0也不是1,为其他数。
(6)野指针:指针指向的位置不确定
int a; //局部变量不初始化,默认为随机值
int* p; //局部指针变量不初始化,默认为随机地址
int main()
{
int arr[10]={0};
int* p=arr;
int i=0;
for(i=0;i<12;i++)// 指针越界访问
p++;
} 局部变量执行完之后已经把内存还给操作系统,此时原地址已被释放int* test()
{
int a=10;
return *a;
}
int main()
{
test();// 执行完test(),局部变量a已经把内存还给操作系统,
此时原地址已被释放
*p=20;
} (7)指针数组
int* arr[3]={&a,&b,&c};// 指针数组 (8)数组的基本操作:初始化,打印,逆序
void Init(int arr[],int sz)
{
int i=0;
for(i=0;i<sz;i++)
{
arr[i]=i;
}
}
void print(int arr[],int sz)
{
int i=0;
for(i=0;i<sz;i++)
{
printf("%d ",arr[i]);
}
}
void reverse(int arr[],int sz)
{
int i=0;
int left=0;
int right=sz-1;
while(left<right)
{
int temp=arr[left];
arr[left]=arr[right];
arr[right]=temp;
left++;
right--;
}
}
int main()
{
int arr[10]={1};
int sz=sizeof(arr)/sizeof(arr[0]);
Init(arr,sz);//把数组初始化为全零
//print(arr,sz);//把数组打印出来
reverse(arr,sz);//数组逆序
print(arr,sz);
}
|