浅沫记忆 发表于 2021-12-18 10:02:10

【C语言】---指针

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* p; p+1--->4

int arr={0};//arr共开辟了40字节
int* p=arr;//arr的首元素的地址赋给p
int i=0;
for(i=0;i<10;i++)
{
   *(p+1)=1;//走一步是四个字节
}
1
1
1
1
1
1
1
1
1
1


[*]char* p; p+1--->1

int arr={0};
char* p=arr;
int i=0;
for(i=0;i<10;i++)
{
   *(p+1)=1;//p走一步是1个字节
}
1
1
其他
0
0
0
0
0
0
0
数组arr[ 10 ]是int类型的,共占有40个字节
int* p走一步是4个字节,循环十次,走40个字节,所以可以把数组中的10个元素全部修改为1;char*p走一步是1个字节,循环十次,走10个字节,只能修改数组中的2.5个元素,且arr既不是0也不是1,为其他数。
(6)野指针:指针指向的位置不确定

[*]指针未初始化导致野指针

int a; //局部变量不初始化,默认为随机值
int* p; //局部指针变量不初始化,默认为随机地址


[*]指针越界访问导致野指针

int main()
{
   int arr={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={&a,&b,&c};// 指针数组(8)数组的基本操作:初始化,打印,逆序

void Init(int arr[],int sz)
{
int i=0;
for(i=0;i<sz;i++)
{
    arr=i;
}
}
void print(int arr[],int sz)
{
int i=0;
for(i=0;i<sz;i++)
{
    printf("%d ",arr);
}
}
void reverse(int arr[],int sz)
{
int i=0;
int left=0;
int right=sz-1;
while(left<right)
{
      int temp=arr;
    arr=arr;
    arr=temp;
    left++;
    right--;
}
}
int main()
{
int arr={1};
int sz=sizeof(arr)/sizeof(arr);
Init(arr,sz);//把数组初始化为全零
//print(arr,sz);//把数组打印出来
reverse(arr,sz);//数组逆序
print(arr,sz);
}





https://blog.51cto.com/u_15459193/4812471
页: [1]
查看完整版本: 【C语言】---指针