指针变量必须先赋值,再使用 例main() 〔inti=10; nt 2000 整型变量i printf(%od”,*p) 2001 10 2002 2003 危险! 2004 指针变量p 2005 随枳 maint 2006 nt p p=&k printf("%d”,*p)
例 main( ) { int i=10; int *p; *p=i; printf(“%d”,*p); } 危险! 例 main( ) { int i=10,k; int *p; p=&k; *p=i; printf(“%d”,*p); } 指针变量必须先赋值,再使用. …... …... 2000 2004 2006 2005 整型变量i 10 指针变量p 2001 2002 2003 随机
★零指针与空类型指针 ☆零指针:(空指针) p指向地址为0的单元, ●定义指针变量值为零丿系统保证该单元不作它用 ●表示:int*p=0; 表示指针变量值没有意义 #define nulL 0 int *p=NULL cHat Bi void *p2 p=NUL与未对p赋值不同 pyH=亚 用途 ◆避免指针变量的非法引用 p2(void *p1 ◆在程序中常作为状态比越 ◆Void*类型指针 表示不指定p是指向哪一种 ●表示∶void*p 类型数据的指针变量 使用时要进行强制类型转换
零指针与空类型指针 ❖零指针:(空指针) ⚫定义:指针变量值为零 ⚫表示:int * p=0; p指向地址为0的单元, 系统保证该单元不作它用 表示指针变量值没有意义 #define NULL 0 int *p=NULL: ⚫p=NULL与未对p赋值不同 ⚫用途: ◆避免指针变量的非法引用 ◆在程序中常作为状态比较 例 int *p; ...... while(p!=NULL) { ...… } ❖void *类型指针 ⚫表示: void *p; ⚫使用时要进行强制类型转换 例 char *p1; void *p2; p1=(char *)p2; p2=(void *)p1; 表示不指定p是指向哪一种 类型数据的指针变量
★指针变量的引用与操作 指针变量是一种特殊的变量,变量中存放的不是某 种数据类型的数据,而是另一个变量或常量的地址。 指针变量的操作主要包括 (1)取地址运算“&”和取內容运算“*” 1行 int nun,*pn; 2行pn=&unum 3行*pn=100 等效于num=100; 注意: 1)第3行,“*”作为访问目标变量的运算符,表示num内 容 2)第1行,在定义指针时,“*”作为说明符。 3)第2行,“&”作为取mum变量的地址 其中:“&”和“*"互为逆运算 例如:intx,*ptr=&X 则&(ptr)表示指针ptr *(&x)表示变量x(具体描述见下页)
指针变量是一种特殊的变量,变量中存放的不是某 种数据类型的数据,而是另一个变量或常量的地址。 指针变量的操作主要包括: (1)取地址运算“&” 和取内容运算“*” 1行 int num, *pn; 2行 pn=# 3行 *pn=100; 等效于num=100; 注意: 1)第3行,“*”作为访问目标变量的运算符,表示num内 容 2)第1行,在定义指针时,“*”作为说明符。 3)第2行,“&”作为取num变量的地址 其中:“&”和“*”互为逆运算 例如: int x, *ptr=&x; 则 &(*ptr) 表示指针ptr *(&x) 表示变量x (具体描述见下页) 指针变量的引用与操作
★&与*运算符 含义取交鲁 子素梦 指针所指向变量的内容 为逆 运 pointer 1 pointer 优先级:塾理編先级:2 pointer 2000 10 结合性:自 2000 整型变量i 2001 10 i pointer=&i=& i pointer) 2002 1 pointer (&1) 2003 2004 变量 i pointer 2005 2060- 指针变量 2006 pointer 指针变量,它的内容是地址量 pointer-指针的目标变量,它的内容是数据 & c1 pointer-指针变量占用内存的地址
&与*运算符 ❖含义 含义: 取变量的地址 单目运算符 优先级: 2 结合性:自右向左 含义: 取指针所指向变量的内容 单目运算符 优先级: 2 结合性:自右向左 ❖两者关系:互为逆运算 ❖理解 …... …... 2000 2004 2006 2005 整型变量i 10 变量i_pointer 2001 2002 2003 2000 指针变量 i_pointer-----指针变量,它的内容是地址量 *i_pointer----指针的目标变量,它的内容是数据 &i_pointer---指针变量占用内存的地址 2000 10 i_pointer *i_pointer &i_pointer i i_pointer &i &(*i_pointer) i *i_pointer *(&i) i_pointer = &i = &(*i_pointer) i = *i_pointer = *(&i)
§8.3指针和地址运算 (1)赋值运算: 例如: intX,“p1p 2 1=&LX p1指针赋值* p2=p1 /p2指针赋值*/ (2)指针变量运算: 指针变量:只有加或减的操作(+,-,++,--) 指针由当前所指向的位置向前或向后移动n个数据元素的位 置。移动后的实际地址为:p±n* sizeof(数据类型) (3)指针的关系运算 指向同种数据类型的指针可作关系运算,表示它们所存放的 地址之间的关系。 可使用的运算符:<,>,==,!=
(1)赋值运算: 例如: int x, *p1,*p2; p1=&x; /*p1指针赋值*/ p2=p1; /*p2指针赋值*/ (2)指针变量运算: 指针变量:只有加或减的操作( +,-,++,--) 指针由当前所指向的位置向前或向后移动n个数据元素的位 置。移动后的实际地址为:p ± n*sizeof(数据类型) (3)指针的关系运算 指向同种数据类型的指针可作关系运算,表示它们所存放的 地址之间的关系。 可使用的运算符: < , > , = = , != §8.3 指针和地址运算