指针的概念

  • 系统给虚拟内存的每个存储单元分配了一个编号,从 0x00 00 00 00 ~0xff ff ff ff

  • 这个编号咱们称之为地址

  • 指针就是地址

指针的概念_第1张图片
指针变量: 是个变量,是个指针变量,即这个变量用来存放一个地址编号 在 32 位平台下,地址总线是 32 位的,所以地址是 32 位编号,所以指针变量是 32 位的即 4

注意:

1.无论什么类型的地址,都是存储单元的编号,在 32 位平台下 都是 4 个字节, 即任何类型的指针变量都是 4 个字节大小
2. 对应类型的指针变量,只能存放对应类型的变量的地址 举例:整型的指针变量,只能存放整型变量的地址

扩展:

字符变量 char ch=‘b' ; ch 占 1 个字节,它有一个地址编号,这个地址编号就是 ch 的地址 整型变量 int a=0x12 34 56 78; a 占 4 个字节,它占有 4 个字节的存储单元,有 4 个地址编号。
指针的概念_第2张图片

指针变量的定义方法

1.简单的指针变量

数据类型 * 指针变量名;
int * p;
//定义了一个指针变量 p在 定义指针变量的时候 * 是用来修饰变量的,说明变量 p 是个指针变量。
变量名是 p

2.关于指针的运算符

& 取地址 、 *取值
例 1:
int a=0x1234abcd;
int *p;//在定义指针变量的时候*代表修饰的意思,修饰 p 是个指针变量。
p=&a;//把 a 的地址给 p
p 保存了 a 的地址,也可以说 p 指向了 a
p 和 a 的关系分析:a 的值是 0x1234abcd,假如 a 的地址是:0xbf e8
指针的概念_第3张图片
int num;
num=*p;

分析:

1、在调用的时候 *代表取值得意思 ,*p 就相当于 p 指向的变量,即 a, 2、故 num=*p 和 num =a 的效果是一样的。 3、所以说 num 的值为 0x1234abcd。

扩展:

如果在一行中定义多个指针变量,每个指针变量前面都需要加*来修饰
int *p,*q; //定义了两个整型的指针变量 p 和 q
int * p,q; //定义了一个整型指针变量 p,和整型的变量 q

#include

int main()
{
  int a = 100;
  int b = 200;
  int *p1,p2 = &b;  //表示该变量的类型是一个指针变量,指针变量名是 p1 而不是*p1.
 //p1 在定义的时候没有赋初值,p2 赋了初值
  p1 = &a;  //p1 先定义后赋值
  printf("%d\n", a);
  printf("%d\n", b);
  printf("%d\n",*p1);
  printf("%d\n",*p2);
 
 return 0;
  
}
指针的概念_第4张图片

注意:

在定义 p1 的时候,因为是个局部变量,局部变量没有赋初值,它的值是随机的,p1 指向哪里不一定,所以 p1就是个野指针

指针大小

//在 32 位系统下,所有类型的指针都是 4 个字节
#include 
int main()
{
  char *p1;
  short int *p2;
  int *p3;
  long int *p4;
  float *p5;
  double *p6;
  printf("%d\n",sizeof(p1));
  printf("%d\n",sizeof(p2));
  printf("%d\n",sizeof(p3));
  printf("%d\n",sizeof(p4));
  printf("%d\n",sizeof(p5));
  printf("%d\n",sizeof(p6));
  return 0;
}
指针的概念_第5张图片

示例:

#include 
int main()
{
  int a=0x1234abcd;
  int *p;
  p=&a;
  printf("&a=%p\n",&a);
  printf("p=%p\n",p);
  return 0;
}
指针的概念_第6张图片

你可能感兴趣的:(开发语言)