指针介绍:
指针:指针变量,存储的是地址编号。
地址编号:内存会按照字节进行编号,一个字节一个编号
4G内存 === 4G字节
int a = 10; //10是空间里面存储的数值。
// 空间的名字叫a
// &a ----
简单使用指针:
指针先定义再使用:
指针定义格式:
指针指向对象的数据类型 *指针名; // 定义指针,开一个指针空间,
a、指针指向对象的数据类型:看指针保存什么类型的地址。
int a = 10;
&a --- 0062FE9C
定义一个指针指向a,保存a的地址 --- int
定义指针的时候*--- 代表指针的标记
定义的这个变量不是普通的存放值的变量,这是一个指针变量,用来存储地址编号的。
int *p; // p是指针变量 ,用来存地址编号的。
int p; // p是int型的变量,用来存int型的数据。
指针名:
指针空间的名字就是指针名.
eg:
int a = 10; // &a --- 0x0062FE9C
int *p; // p指针指向a;
p = &a; // p指向了a , --- 指针有了明确指向后,就有了*p --- *解地址 --- *p == *(&a) == a
指针空间和指针指向的空间
指针本身空间 --- 存地址编号的, --- 指针名 --- 什么时候有 --- 定义指针的时候就有了
指针指向的空间 --- 存储 数值 --- *指针名 --- 什么时候有 --- 给指针赋了地址值之后,指针 有了明确指向之后才有的。
指针空间大小:
32位 --- --- 地址编号 4个字节
64位 --- --- 地址编号 8个字
指针空间大小和系统位数有关,与指向对象的数据类型无关。
char *p1;
short *p2;
int *p3;
double *p4;
char (*s)[20];
int (*func)(int a,int b)
// 定义一个数组用来存储指针的
char *arr[4];
数组名:arr
元素个数:4
下标:0~3
数据类型:char *
数组类型:char *[4]
arr的空间大小:16 / 32
指针偏移运算:
指针偏移和指向对象的数据类型有关,指向对象的数据类型 从 指针定义的格式 看
指针偏移一般在数组里面用
int a[] = {-1,20,3,40,60,100,45};
定义一个指针指向a[0]
指针指向对象的类型:int
int *p = a; // &a[0] 数组名就是数组首元素的地址。
地址: p p+1
&a[0] &a[1]
空间的名称:*p *(p+1) --- *解地址
*(&a[0] ) *(&a[1])
指针分析:
指针名:
指针指向对象的类型:除了 *指针名 剩下的就是它指向对象的类型
指针类型: 除了 指针名 剩下的就是指针的类型。
int *p;
指针名:p
指针指向对象的类型:int
指针类型: int *
char (*s)[20];
指针名:s
指针指向对象的类型:char [20]
指针类型: char (*)[20]
int (*func)(int a,int b);
指针名:func
指针指向对象的类型:int (int a,int b);
指针类型: int (*)(int a,int b)
指针遇上强转:
int a = 0x12345678;
int *p = &a;
// char *p = &a; 指针类型不稳定
eg:
#include<stdio.h>
int main()
{
int a = 0x12345678;
char *p = (char *)&a;
printf("%#x %#x %#x %#x\n",*(p+0),*(p+1),*(p+2),*(p+3)); 0x78 0x56 0x34 0x12
return 0;
}