指针基础
引:
变量值的访问方式:
-
直接访问方式——直接通过变量名存取变量值的方式
代码中变量名代表的是变量的值;
int a = 100; a = a+50; printf(“%d”,a);
以上语句中都是通过变量名访问变量的值。
-
间接访问方式——通过访问变量的地址,来获得变量的值
定义一个变量p, p存放的是a这个变量的地址,通过p这个变量名可以直接访问到a的地址。
一、概念
在存储时,内存被分为一块一块的,每一块都有自己的编号
例:
void main()
{
int x = 10;
int y = 20;
}
/*
内存:酒店
每个房间:一块内存
订两个房间,门牌号px,py(变量的地址) 10住px,20住py
*/
-
指针与指针变量
&a——变量a的地址
指针——内存地址/变量存储的地址
指针变量——存放普通变量地址的变量/存放指针的变量
如果p是指针类型变量,而且p中存放了变量x的地址,则称p指向x
-
指针转换说明和指针类型
%p——指针的转换说明(以十六进制输出)
指针类型——表示指针所指变量的数据类型,
如:
int变量的指针用int类型的指针存储;int类型指针不能指向float变量
(如果用%d,则是将16进制转换成十进制输出)
二、指针变量的定义声明与使用
-
定义与声明
type *var-name;
type
—— 指针所指变量的数据类型(void*,表示未确定类型的指针,c,c++规定void*可以强转为 任何其他类型的指针)*
—— 指针说明符,标识p为指针变量var-name
—— 指针变量的名称
-
使用
- 取地址运算符
&
:取操作对象的地址(对于常量表达式,寄存器变量不能取地址,它们存储在储 存器中,没有地址) - 指针运算符
*
:通过操作对象的地址,获取存储内容x=&i; //x为i的地址,*x为i的内容
&
和*
的结合方向
例*&x; //右结合,先获取地址,在获取地址里存储内容
小提示:int main() { int var = 20; /* 实际变量的声明 */ int *ip; /* 指针变量的声明 */ ip = &var; /* 在指针变量ip中存储 var 的地址 */ printf("var 变量的地址: %p\n", &var ); printf("ip 变量存储的地址: %p\n", ip ); printf("*ip 变量的值: %d\n", *ip ); return 0; } /* 结果: var 变量的地址: 0x7ffeeef168d8 ip 变量存储的地址: 0x7ffeeef168d8 *ip 变量的值: 20 */
&取地址符:其实是指向最低地址的指针
如:int a;scanf(“%d”, &a); 其实是将指向a的最低地址
- 取地址运算符
三、指针变量的初始化与赋值
-
指针变量的赋值
指针变量在使用前必须赋值,将一个类型相同的变量地址赋给指针变量;(如在打印 *j 前,必须给 j 赋值)
如果要通过指针变量访问指向的变量的值,那么指向的变量也应该有具体的值。
#include <stdio.h> int main() { int i = 100, *j; j = &i; printf(“%d", *j); return 0; } //*j 相当于 i
-
指针变量的初始化
指针变量可以在定义时赋值,赋值“NULL”或“0”(“0”是NULL的字符码,不是数字0)
-
NULL 指针
在变量声明的时候,如果没有确切的地址可以赋值,可为指针变量赋一个 NULL 值
NULL 指针(空指针)是一个定义在标准库中的值为零的常量。表明该指针不指向一个可访问的内存位置。
例:
#include <stdio.h> int main() { int *ptr = NULL; printf("ptr 的地址是 %p\n", ptr ); return 0; } //结果:ptr 的地址是 0x0
-