一、指针定义

指针是一个变量存放内存单元的地址(编号)

二、指针类型的意义

首先,用一段代码计算一下不同类型指针的长度分别是多少

#include<stdio.h>
int main()
{
   printf("%d\n",sizeof(int*));
   printf("%d\n",sizeof(char*));
   printf("%d\n",sizeof(double*));
   printf("%d\n",sizeof(float*));
}

令人匪夷所思的是:最后结果是一样的都是8(在64位的pc机上)

这会让人怀疑:类型不同,为什么指针的长度都是一样的?

这时我们可以把地址打印一下:

#include<stdio.h>
int main()
{
  int i=0x11223344;
  int* pa=&i;
  //char* pc=&i;
  printf("%p\n",pa);
  //printf("%p\n",pc);
}

这时我们又发现char类型和int类型所存储的地址一模一样,这时我们更疑惑,指针类型不同好像没有什么意义,但是经过思考又发现:

#include<stdio.h>
int main()
{
  int i=0x11223344;
  int* pa=&i;
  //char* pc=&i;
  printf("%p\n",pa+1);
  //printf("%p\n",pc+1);
}

最终的输出结果是不一样的,同样是在指针pa和pc后加1,char类型的指针最终输出的地址比原地址多1,而int类型的指针最终输出的地址比原地址多4。

到这可以思考一下:1和4,char类型占1个字节,而int类型占4个字节。所以指针类型的不同代表了步长的不同(通俗点说就是指针走一步能走多远)

举个例子(指针访问数组):(将数组中的元素全部赋值为1)

#include<stdio.h>
int main()
{
  int arr[10]={0};
  int* pa=arr;
  int i=0;
  for(i=0;i<10;i++)
  {
    *(p+i)=1;
    printf("%d\n",*(p+i));
  }
}

同理:当我们运用*(解引用操作符)时,可以计算不同类型指针走一步其能够访问空间的大小

int* pa:*pa能访问4个字节
char* pa:*pa能访问1个字节
double* pa:*pa能访问8个字节

三、野指针

1.概念:就是指针指向的位置是不可知的(随机的、不确定的、没有明确限制的)

2.形成原因:

  • 局部变量未初始化:
#include<stdio.h>
int main()
{
	int a;//局部变量不初始化,默认是随机值
	int* p;//局部的指针变量,就被初始化随机化
	*p = 20;
}

最后导致:程序无法正常运行

关于指针(定义、指针类型的意义、野指针)_初始化

  • 指针越界访问:
#include<stdio.h>
int main()
{
  int arr[10]={0};
  int* pa=&a;
  int i=0;
  for(i=0;i<=11;i++)
  {
    *(pa+1)=i;//超出了数组元素的长度,称为野指针
  }
}
  • 指针指向的空间释放:(运用到函数)

前言:参数分为形参和实参,形参一旦运行完毕就会自动销毁

#include<stdio.h>
int* test()
{
	int a = 10;//a是局部变量
	return &a;
}
int main()
{
	int* p=test();
	printf("%d\n", *p);
	return 0;
}

持续更新关于指针的内容,感兴趣可以追更。