引子:数据在内存中是如何存储的,又是如何读取的?内存编号就是内存的地址(
内存中每个字节都有一个编号,
即地址)
1.
概念:e
地址:内部存储器的编号,称为地址。如变量a
的位置编号,变量b
的位置都是指针。
指针变量:专门存放地址的变量称为指针变量。
地址、指针、指针变量都称为指针。
一、
变量的地址
(
指针
)
和指向变量的地址变量
(
指针
)
1.
概念:
变量的指针:
就是变量的地址。
指针变量:
是用来存放地址的变量,普通变量是用来存放数据的,指针变量是存放地址的。
2.
定义地址变量:
1)
格式:
[
存储类型
]
数据类型
*
指针变量名;
int i, j;
int * pointer1, *pointer2;
存储类型是这个地址变量的存储位置
数据类型指的是这个地址变量指向的目标变量类型,不代表本身的类型大小。
2)
指针变量的赋值:
方法一:
int a = 5; int *p = &a; //
定义并初始化。
方法二:
int a = 5; int *p; p = &a;//
先定义后赋值。
PS: 定义时,int *p中*是为了说明该p是地址变量,用来存放地址; 定义地址变量时必须指定数据类型,不同类型指针不可相互赋值; 指针变量的数据类型不表示变量的类型,是表示该变量指向的目标的数据类型,访问内存时读取的内存空间大小。 |
3.
指针变量引用
1)
*
和
&
符号
*
定义指针变量/
取地址对应的变量的内容(
间接访问)
;
//i = 3
直接
,*p=3
间接
&
取变量的地址。
*
和&
互为逆运算。自右向左
3)
引用
Ø
对指针变量赋值
p = &a;
Ø
引用地址变量指向的内容
printf( “a=%d\n”, *p );
Ø
引用变量本身的内容(
即存储的地址)
printf(“%x\n”, p);
eg: int i = 188; int *p = &i; p 指针变量,内部存放的是目标的地址; *p 目标,目标内存数据; &p 指针变量的内存地址; p = &i = &(*p) i = *p = *(&i) |
4.
指针运算
指针运算就是地址运算,即指针变量中的地址作为运算量。
地址只能做算术、关系、赋值运算。
1)
算术运算
px + n
代表指针向地址大的方向移动 n
个
数据。
移动后的地址量是: (px) + sizeof(px
的类型) * n
px++
指针变量向地址大的方向移动一个数据。
px - py
表示两个相同类型指针间相差数据的个数,而不是一个地址量。
px - py
的结果是 (px - py) /sizeof(
数据类型)
px + py
的结果?