评论

收藏

[C++] 【C语言】---指针

编程语言 编程语言 发布于:2021-12-18 10:02 | 阅读数:430 | 评论:0

1.指针概念
(1)指针:地址(房间号),通过地址找到内存单元
(2)指针变量:存放在指针中的变量被当成地址处理,类型:int*
int a =20;
int* p=&a; //P是指针变量,存放的是a的地址
*p=a;
(3)指针和指针类型
DSC0000.png
指针的大小在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[10]={0};//arr[10]共开辟了40字节
int* p=arr;//arr[10]的首元素的地址赋给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[10]={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[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);
}





关注下面的标签,发现更多相似文章