C语言10指针

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
例 *i_pointer=20; —间接访问
5
7.2 指针变量
指针变量与其所指向的变量之间的关系
i_pointer
变量i
i
*i_pointer
2000
3
&i
i_pointer
*i_pointer i=3
*i_pointer=3
• 指针变量的定义 [存储类型] 数据类型 *指针名;
• 注•• i指意nt针:*变p1量, *名p是2例;指p1与针,fsipnlt变o2atait量*,nit不cpt本1*是c身,*指qh*p*pa的表针;不1pr2,存示1;的是p*,*储定n目2‘p;a类义标2*m’型指变e运;针量算变的符量数合据法类标型识符
*p=i; printf(“%d”,*p); }
危险!
main( ) { int i=10,k; int *p;
p=&k; *p=i; printf(“%d”,*p); }
2020/5/11
…… 2000 2001 2002 2003 2004 2005 ……
……
10
随机值 ……
变量 i
变量 p
8
• 零指针(NULL)与空类型指针(void)
• 零指针:(空指针 NULL)
p指向地址为0的单元,
• 定义:指针变量值为零 系统保证该单元不作它用
• 表示:int * p=0;
表示指针变量值没有意义
• 注意:
(1) p=NULL与未对p赋值不同
(2) 用于避免指针变量的非法引用
• 空类型指针:(void)
表示不指定p是指向哪一种 类型数据的指针变量
printf("%d,",a[i]); printf("\n"); } 2020/5/11
实参用数组 形参用指针
19
• 数组名作为函数参数:地址传递
例 将数组a中的n个整数按相反顺序存放
void inv(int *x, int n) { int t,*i,*j,*p,m=(n-1)/2;
2002 2004
1 array[1] 2 array[2]
int array[10]; int *p; p=&array[0]; p=array; int *p=&array[0]; int *p=array;
2006 3 array[3] 2008 5 array[4] 200A 8 array[5]
…… 2000 2002 2004 2006 …… …… 30F8 30FA ……
ma…in…
a: 59
b: 95 p_1: 2000
p_2: 2002
swap
p1: 2000
p2: 2002
……
11
7.3 指针与数组
数组名是表示数组首地址的地址常量
数组名:首地址
p
2000 1 array[0]
• 如何指向数组元素
(2) p++, p--, p+i, p-i, p+=i, p-=i 等
2008 5 array[4]
200A 8 array[5] (3) 若p1与p2指向同一数组,则
p1-p2=两指针间元素个数(p1-p2)/d
……
……
……
(4) p1+p2 无意义
2020/5/11
300A &a[0]
14


• 定义:不指定所指向单元数据类型的指针变量
• •
表注示 意: :v使oi用d例时* 要pvc;ho进iadr行**强pp21制;; 类型转换
p1=(char *)p2;
2020/5/11
p2=(void *)p1;
9
• 指针变量作为函数参数——地址传递
特点:共享内存,“双向”传递
例:将数从大到小输出
……
……
……
2020/5/11
300A &a[0]
12


7.3 指针与数组
数组名是表示数组首地址的地址常量
数组名:首地址
p
2000 1 array[0]
• 指针的运算:赋值运算
(1) p=&a;
(将变量a地址 p)
2002 2004 2006
1 array[1] 2 array[2] 3 array[3]
}
数据,*p单p22=向=te传*mte递pm; p;
main( )
{ int a,b; int *p_1, *p_2
scanf("%d,%d",&a,&b);
p_1=&a, p_2=&b;
if(a<b) swap(p_1,p_2);
printf("\n%d,%d\n",a,b); }2020/5/11
例 int i; int *p=&i; int *q=p;
用已初始化指针变量作初值
例 main( ) { int i; static int ..............
} 2020/5/11
*p=&i; ()
不能用auto变量的地址 去初始化static型指针
7
பைடு நூலகம்
• 指针变量必须先赋值再使用
main( ) { int i=10; int *p;
元素 取元素
array 1 array[0] *array
p 1 p[0] *p
array+1 1 array[1] *(array+1) p+1 1 p[1] *(p+1)
array+2 2 array[2] *(array+2) p+2 2 p[2] *(p+2)
array+3 3 array[3] *(array+3) p+3 3 p[3] *(p+3)
2020/5/11
13


7.3 指针与数组
数组名是表示数组首地址的地址常量
数组名:首地址
p
2000 1 array[0]
• 指针的运算:算术运算 2002 2004 (1) p i p i×d (i整型数,变量字节数) 2006
1 array[1] 2 array[2] 3 array[3]
(2) p=array; (将数组array首地址 p) 2008 5 array[4]
200A 8 array[5] (3) p=&array[i]; (将数组第i元素地址 p)
……
……
……
(4) p1=p2;
(指针变量p2值 p1)
(5) 整型变量 p (×),p值整型变量(×)300A &a[0]
第七章 指针
• 指针的基本概念 • 指针变量 • 指针与数组 • 指针与字符串 • 指针与函数 • 指针数组与多级指针
7.1 指针的基本概念
• 变量与地址的概念
内存中每个字节有一个编号—地址
0000
int i;
…… 2000
float k;
编译或函数调用时为其分配内存单元
2001 2002 2003
200A 8 array[5] (3) p1==p2 表示p1与p2指向同一元素
……
……
……
(4) 若p1与p2指向不同数组,比较无意义
(5) p==NULL或p!=NULL
2020/5/11
300A &a[0]
15


• 数组元素的表示方[ ]法变址运算符
a[i] *(a+i)
地址
元素 取元素 地址
输出:5 6
2020/5/11
例3:注意指针当前值 main() { int i,*p,a[7];
p=a; for(i=0;i<7;i++)
scanf("%d",p++); printf("\n");
for(i=0;i<7;i++,p++)
printf("%d",*p);
}
17
• 数组名作为函数参数:地址传递
16
例1:int a[ ]={1,2,3,4,5,6,7,8,9,10},*p=a,i; 数组元素地址的正确表示:
(A) &(a+1) (B) a++ (C) &p (D) &p[i]
例2:注意指针变量的运算 void main() { int a[ ]={5,8,7,6,2,7,3}; int y,*p=&a[1]; y=(*--p)++; printf(“%d ”,y); printf(“%d”,a[0]); }
• 直接访问:用变量的地址去访问变量值 • 间接访问:通过存放变量地址的另外一个变量去访问变量值
…… 2000 2001 2002 2003 2004 2005 ……
2020/5/11
……
1230
整型变量 i
变量 i 内容
例 i=3; —直接访问
2000
……
变量 i_pointer
i_pointer 内容
变量
变量值
i_pointer = &i = &(*i_pointer) i = *i_pointer = *(&i)
i_pointer 指针变量,它的内容是地址量
*i_pointer 指针的目标变量,它的内容是数据
2020/5/11&i_pointer 指针变量占用内存的地址
4
• 直接访问与间接访问
变量是对程序中数据 存储空间的抽象
2020/5/11
2004 2005 ……
内存 ……
i
k
…… 2
• 指针与指针变量的概念
• 指针:一个变量的的地址 • 指针变量:专门存放变量地址的变量
指针 变量的地址
2020/5/11
…… 2000 2001 2002 2003 2004 2005 ……
……
10
7.3 指针与数组
数组名是表示数组首地址的地址常量
数组名:首地址
p
2000 1 array[0]
• 指针的运算:关系运算
(1) p1<p2 表示p1指的元素在前
2002 2004 2006
1 array[1] 2 array[2] 3 array[3]
(2) p1>p2 表示p1指的元素在后
2008 5 array[4]
2000
a: 5
2002
b: 9
……
……
……
…… swap
30F8
x: 59
30FA
y: 95
……
……
10
• 指针变量作为函数参数——地址传递
特点:共享内存,“双向”传递
例:将数从大到小输出
swap(int *p1,int *p2)
{ int temp; int *temp;
t*epm1=p*=指p*2p针;1变; 量*tetm在emp使p=用=p*1前p; 1; *p2=te没mp必有; 须改*p赋变p1地1=值地=址p!址*2传p;内2递;
printf("%d,",a[i]); printf("\n"); }
2020/5/11
实参用数组 形参用数组
18
• 数组名作为函数参数:地址传递
例 将数组a中的n个整数按相反顺序存放
void inv(int *x, int n) { int t,*p,*i,*j,m=(n-1)/2;
i=x; j=x+n-1; p=x+m; for(;i<=p;i++,j--) { t=*i; *i=*j; *j=t; } } main() { int i,a[10]={3,7,9,11,0,6,7,5,4,2}; inv(a,10); printf("The array has been reverted:\n"); for(i=0;i<10;i++)
array+4 5 array[4] *(array+4) p+4 5 p[4] *(p+4)
array+5 8 array[5] *(array+5) p+5 8 p[5] *(p+5)
下标法
指针法
int array[6]; int *p = array;
2020/5/11
a[i] p[i] *(p+i) *(a+i)
例 将数组a中的n个整数按相反顺序存放
void inv(int x[], int n) { int t,i,j,m=(n-1)/2;
for(i=0;i<=m;i++) { j=n-1-i; t=x[i]; x[i]=x[j]; x[j]=t; } } main() { int i,a[10]={3,7,9,11,0,6,7,5,4,2}; inv(a,10); printf("The array has been reverted:\n"); for(i=0;i<10;i++)
• 指针变量只能指向定义时所规定类型的变量 • 指针变量定义后,变量值不确定,应用前须先赋值
2020/5/11
6
• 指针变量的初始化
赋给指针变量, 不是赋给目标变量
[存储类型] 数据类型 *指针名 = 初始地址;
例 int i; int *p=&i;
变量必须已说明过 类型应一致
例 int *p=&i; int i; (×)
swap(int x,int y)
{ int temp;
temp=x;
x=y; y=temp;
值传递
}
main( )
{ int a,b;
scanf("%d,%d",&a,&b);
if(a<b) swap(a,b);
printf("\n%d,%d\n",a,b);
}
2020/5/11
…… ma…in…
2000
……
整型变量 i
变量 i 内容
指针变 量
变量 i_pointer
i_pointer 内容
3
• & 与 * 算符
两者关系:互为逆运算
含义: 取变含量义的:地取址指针所指向变量的内容
单优目先运级:算2符单优目先运级指:算针2符变量 变量地址(指针) 结合性:自右结向合左性:自右向左 指向
地址存入 指针变量
相关文档
最新文档