1.概述
地址编号:地址编号:就是计算机为了存储数据,每一个程序在32机中占4G,以一个字节为最小单位进行操作,每一个字节都有其对应的地址,该地址就是地址编。
指针:地址编号的数据类型
指针变量:存储地址编号的变量,其数据类型为指针
在32位机中一个指针占4B
在 64 位机中一个指针占 8B
代码:
#include<stdio.h>
int main(int argc, char const *argv[])
{
printf("char *的大小为:%ld\n",sizeof(char *));
printf("int *的大小为:%ld\n",sizeof(int *));
printf("short *的大小为:%ld\n",sizeof(short *));
printf("long *的大小为:%ld\n",sizeof(long *));
printf("float *的大小为:%ld\n",sizeof(float *));
printf("double *的大小为:%ld\n",sizeof(double *));
return 0;
}
2.指针变量
指针变量实质上是一个变量,存放的是数据类型为指针的地址编号
1.定义:
数据类型 变量名
2.分类:
char * 储存数据类型为字符型的地址编号 字符指针
int * 储存数据类型为整型的地址编号 整型指针
short *储存数据类型为短整型的地址编号 短整型指针
long *储存数据类型为长整型的地址编号 长整型指针
float *储存数据类型为float的地址编号 单精度浮点型指针
double *储存数据类型为double的地址编号 双精度浮点型指针
如:
int num = 10;
int *p ;
注意:
如果同时定义多个指针变量的时候,每个指针变量前都要加*
如:
void fun()
{
int a,b,c;
int *p1,*p2,*p3;
}
初始化:
1,当指针变量是局部变量,在其定义时没有给其值,此时系统将随机为其给一个值,这种指针称为野指针
如:
int *p;
2,当指针变量值等于NULL时,这种指针称为空指针
如:
int *p = NULL;
3,定义指针变量时赋真实的地址
如:
int num = 10;
int *p = #
如:
int num = 10;
int *p ;
p = #
运算符:
&
作用:取地址
&要取地址的变量
注意:只能获取变量的地址
代码 :
#include <stdio.h>
char c = 'a';
int main(int argc, char const *argv[])
{
int num = 10;
int *p = #
printf("p = %p\n",p);
char *p2 = &c;
printf("p2 = %p\n",p2);
//int *p3 = &10;
const int num02 = 10;
int *p4 = &num02;
printf("p4 = %p\n",p4);
return 0;
}
*
作用:取值或改值
*指针变量名
示例
#include <stdio.h>
int main(int argc, char const *argv[])
{
int num = 10;
int *p = #//此时* 表示变量 p 是 int 型的指针变量
printf("*p=%d\n",*p);//此时* 表示为取值
*p = 1;//修改p 指向的地址的值
printf("num=%d\n",num);
return 0;
}
3.指针类型
指针本身的类型
口诀:将指针变量的变量名去除,剩余的就是指针本身的类型
如:
int *p1;// int *
int **p2;//int **
int (*p)(int int);//int (*)(int,int)
...
示例:
int num = 10;
int *p = &num ;
char *p2 = #
指针指向的数据的数据类型
口诀:将指针变量的变量名和与它离得最近的*去除 , 剩余的就是指针本身的类型
如:
int *p1;// int
int **p2;//int *
int (*p)(int int);//int (int,int)
取值宽度
指针变量的数据类型的长度就是指针的取值宽度
char * 取值宽度 1
int * 取值宽度 4
float * 取值宽度 4
单位跨度(步长)
就是地址在进行加减时,地址所增减的数据类型的长度(字节数)
int * 单位跨度为4字节 char * 单位跨度为1字节
short * 单位跨度为2字节
示例:
#include <stdio.h> int main(int argc, char const *argv[])
{
int num = 0x01020304;
char *p = (char* )#
/*
注意: 在 liunx 系统中数据存储将倒序
所以num 在内存中存储的顺序为
0x04 0x03 0x02 0x01
将num 地址强制转换为 char * 类型
此时取值宽度为1 字节 , 单位跨度为 1 字节
p为首个字节存储的地址 +1, 加的是一个单位跨度即 1 字节
所以从第二个字节开始取1 个字节长度的数据
即0x03
*/
printf("%#p\n",*(p+1));
/*
将num 地址强制转换为 short * 类型
此时取值宽度为2 字节 , 单位跨度为 2 字节
p为首个字节存储的地址 +1, 加的是一个单位跨度即 2 字节
所以从第三个字节开始取2 个字节长度的数据
即:0x0102
*/
short * p2 = (short *) #
printf("%#p\n",*(p2+1));
return 0;
}
4.void
作用
void与指针结合作为一种指针类型,如void *,这种指针我们称为万能指针,意味着任何一种地址都可以赋值给类型的指针变量
示例
#include <stdio.h>
int main(int argc, char const *argv[])
{
int num01 = 10;
char c = 'a';
short s = 1;
//
int *p1 = &num01;
char *p2 = &c;
short *p3 = &s;
//
void *p4 = &num01;
void *p5 = &c;
void *p6 = &s;
return 0;
}
5.指针变量使用的注意事项
1, 野指针操作会出现段错误
定义一个局部变量的指针,并不给其赋值,它将不知道指向哪一块地址,所以叫野指针
代码:
void fun01()
{
//野指针
int *p;
printf("*p=%d\n",*p);
}
2,空指针操作会出现段错误
定义一个NULL的指针,叫空指针
代码:
void fun02()
{
//空指针
int *p = NULL;
printf("*p=%d\n",*p);
}
3, 不要对万能指针进行操作
void fun03()
{
int num = 10;
int *p = #
printf("*p=%d\n",*p);
void *p2 = #
printf("*p2=%d\n",*p2);
}
4, 操作指针变量不要越界
代码:
void fun04()
{
int num = 0x01020304;
int *p = #
char *p2 = (char *) p;
printf("%#p\n",*p2);
printf("%#p\n",*(p2+1));
char c = 'a';
char * p3 = &c;
//1
int *p4 = (int *)p3;
printf("%#p\n",*p4);
}