全的C语言指针详解
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第6章 指针
6.1 指针定义与使用 6.2 指针与函数 6.3 指针与数组 6.4 指针与字符串 6.5 指针数组与多级指针 6.6 指针与动态内存分配 6.7 指针的深层应用
6.1 ห้องสมุดไป่ตู้针的引出
一. 地址与指针
1. 地址与取地址运算
C程序中的变量在内存中占有一个可标识的存储区,
每一个存储区是由若干个字节组成, 每一个字节都有
(2) 引用指针变量时的 * 与 定义指针变量时的 * 不同
定义变量时的 * 只是表示其后的变量是指针变量
int a , *p ; 让p指向a p = &a ;
2012
scanf ( “%d” , p ) ;
1010
printf (“%d\n” , *p ) ; 即&a
p
*p = 12 ; printf (“%d\n” , *p ) ;
p &a
输出结果:
p2 = p ;
a=5 , b=9
} printf(“a=%d, b=%d \n”, a , b);
max=9 , min=5
printf(“max=%d, min=%d \n”,*p1 ,*p2) ;
}
6.2 指针与函数
一、 指针变量作函数参数
main a5
swap 59 x
例: 2个数按大小顺序输出
说明: 这种方法是交换p1和
if (a<b) swap1( pt1 , pt2) ; p2所指向的变量的值, 即
printf(“a=%d, b=%d\n”, a, b); 交换main函数中a 和b的值
}
所以输出为: a=9, b=5
例 6. 3 ②
main
#include <stdio.h> void swap2( int *p1, int *p2) pt1 &a
1010 23 a 5b 3c 3d
例6. 2
#include <stdio.h> void main( )
p1 &ba
5a
{ int *p1 , *p2 , *p , a , b ; scanf(“%d%d”, &a , &b);
p2 &ba
9b
p1 = &a ; p2 = &b ;
if (a<b) { p = p1 ; p1 = p2 ;
int x , *p ;
2012
1010
x=5;
1010
5
p = &x ;
p
x
三、 指针变量的引用
1. 指针运算符 *
(1) p与*p不同, p是指针变量, p的值是p所指向的变量的地址
*p 是p 所指向的变量 , *p的值是p所指向的变量的值
*p 的值为 5(*p 表示 x) , 而p 的值为 1010
swap1 &a p1
{ int temp;
temp = *p1 ; *p1 = *p2;
a 59
*p2 = temp; }
pt2 &b
&b p2
void main( )
{ int a , b , *pt1 , *pt2 ; scanf(“%d%d”,&a , &b);
b 95
5 temp
pt1 = &a ; pt2 = &b ;
例 : scanf ( “%d” , &x ) ;
x = sqrt(x) ;
printf ( “%d” , x ) ; ② 间接访问 : 将一个变量的地址存放在另一个变量中.
如将变量 x 的地址存放在 变量p 中, 访问x 时先找到p, 再由p 中存放的地址找到 x
2012 1010
p
1010 x
(2) 指针: 一个变量的指针就是该变量的地址(指针就是地址)
自己的地址, 而一个存储区的 地址是指该存储区中
第一个字节的地址
C语言允许在程序中使用变量的地址
( 通过地址运算符&可得到)
如: float x ;
变量 x 的地址 ---- &x
int a[10] ; 数组变量 a 的地址 ---- 数组名 a
2. 指针与指针变量
(1) 变量的访问方式
① 直接访问 : 通过变量名或地址访问变量的存储区
}
9
95 y
5 temp
说明: 该程序不能实现a 和b 的交换因为实参a , b 对形参 x变, y 是“值传递”, x 和y 的 化不影响a 和b 所以输出为: a=5, b=9
例 6. 3 ①
main
#include <stdio.h>
void swap1(int *p1 , int *p2) pt1 &a
对a 重新赋值 等价于 a=12
2. & 与*
p = &a ;
1010 152 a
&*p &(*p) &a *&a *(&a) *p a
3. *与 ++ , - -
int a = 2 , b = 5 , c , d , *p ; (1) p = &a ;
(*p)++ ; ( 等价于 a++ ; ) p 的值为a 的地址, *p 的值为2
2012 101240
p
p 的值不变 , *p 的值为 3
(2) c = *p++ ;
c = *(p++) ; { c = *p ; p++ ; }
执行后 c 的值为 3 , *p 的值为 5
(3) d = *++p ;
d = *(++p) ; { ++p ; d = *p ; }
执行后 d 的值为 3 , *p 的值为 3
(2) 定义指针变量后, 系统为其分配存储空间, 用以存放
其他变量的地址, 但在对指针变量赋值前, 它并没有
确定的值, 也不指向一个确定的变量 例: int x , *p ;
x=5; 注: 指针变量p的值是随机值,
2012 1234
p
1010 5 x
此时p 和 x 并无关联
(3) 使指针变量指向一个确定的变量必须进行赋值
#include <stdio.h>
b
void swap( int x , int y)
{ int temp;
temp = x ;
x = y;
y = temp;
}
void main( )
{ int a , b ;
scanf(“%d%d”,&a, &b);
if (a<b) swap(a , b);
printf(“a=%d, b=%d\n”, a, b);
(3) 指针变量: 存放变量地址的变量, 它用来指向另一个变量
二、 指针变量的定义
1. 格式 : 数据类型 * 指针变量名 ;
例 int *p1 ;
char *p2 ;
2. 说明 :
(1) 在变量定义时, * 号表示该变量是指针变量
( 注意: 指针变量是p1 , p2 , 不是*p1 , *p2 )
6.1 指针定义与使用 6.2 指针与函数 6.3 指针与数组 6.4 指针与字符串 6.5 指针数组与多级指针 6.6 指针与动态内存分配 6.7 指针的深层应用
6.1 ห้องสมุดไป่ตู้针的引出
一. 地址与指针
1. 地址与取地址运算
C程序中的变量在内存中占有一个可标识的存储区,
每一个存储区是由若干个字节组成, 每一个字节都有
(2) 引用指针变量时的 * 与 定义指针变量时的 * 不同
定义变量时的 * 只是表示其后的变量是指针变量
int a , *p ; 让p指向a p = &a ;
2012
scanf ( “%d” , p ) ;
1010
printf (“%d\n” , *p ) ; 即&a
p
*p = 12 ; printf (“%d\n” , *p ) ;
p &a
输出结果:
p2 = p ;
a=5 , b=9
} printf(“a=%d, b=%d \n”, a , b);
max=9 , min=5
printf(“max=%d, min=%d \n”,*p1 ,*p2) ;
}
6.2 指针与函数
一、 指针变量作函数参数
main a5
swap 59 x
例: 2个数按大小顺序输出
说明: 这种方法是交换p1和
if (a<b) swap1( pt1 , pt2) ; p2所指向的变量的值, 即
printf(“a=%d, b=%d\n”, a, b); 交换main函数中a 和b的值
}
所以输出为: a=9, b=5
例 6. 3 ②
main
#include <stdio.h> void swap2( int *p1, int *p2) pt1 &a
1010 23 a 5b 3c 3d
例6. 2
#include <stdio.h> void main( )
p1 &ba
5a
{ int *p1 , *p2 , *p , a , b ; scanf(“%d%d”, &a , &b);
p2 &ba
9b
p1 = &a ; p2 = &b ;
if (a<b) { p = p1 ; p1 = p2 ;
int x , *p ;
2012
1010
x=5;
1010
5
p = &x ;
p
x
三、 指针变量的引用
1. 指针运算符 *
(1) p与*p不同, p是指针变量, p的值是p所指向的变量的地址
*p 是p 所指向的变量 , *p的值是p所指向的变量的值
*p 的值为 5(*p 表示 x) , 而p 的值为 1010
swap1 &a p1
{ int temp;
temp = *p1 ; *p1 = *p2;
a 59
*p2 = temp; }
pt2 &b
&b p2
void main( )
{ int a , b , *pt1 , *pt2 ; scanf(“%d%d”,&a , &b);
b 95
5 temp
pt1 = &a ; pt2 = &b ;
例 : scanf ( “%d” , &x ) ;
x = sqrt(x) ;
printf ( “%d” , x ) ; ② 间接访问 : 将一个变量的地址存放在另一个变量中.
如将变量 x 的地址存放在 变量p 中, 访问x 时先找到p, 再由p 中存放的地址找到 x
2012 1010
p
1010 x
(2) 指针: 一个变量的指针就是该变量的地址(指针就是地址)
自己的地址, 而一个存储区的 地址是指该存储区中
第一个字节的地址
C语言允许在程序中使用变量的地址
( 通过地址运算符&可得到)
如: float x ;
变量 x 的地址 ---- &x
int a[10] ; 数组变量 a 的地址 ---- 数组名 a
2. 指针与指针变量
(1) 变量的访问方式
① 直接访问 : 通过变量名或地址访问变量的存储区
}
9
95 y
5 temp
说明: 该程序不能实现a 和b 的交换因为实参a , b 对形参 x变, y 是“值传递”, x 和y 的 化不影响a 和b 所以输出为: a=5, b=9
例 6. 3 ①
main
#include <stdio.h>
void swap1(int *p1 , int *p2) pt1 &a
对a 重新赋值 等价于 a=12
2. & 与*
p = &a ;
1010 152 a
&*p &(*p) &a *&a *(&a) *p a
3. *与 ++ , - -
int a = 2 , b = 5 , c , d , *p ; (1) p = &a ;
(*p)++ ; ( 等价于 a++ ; ) p 的值为a 的地址, *p 的值为2
2012 101240
p
p 的值不变 , *p 的值为 3
(2) c = *p++ ;
c = *(p++) ; { c = *p ; p++ ; }
执行后 c 的值为 3 , *p 的值为 5
(3) d = *++p ;
d = *(++p) ; { ++p ; d = *p ; }
执行后 d 的值为 3 , *p 的值为 3
(2) 定义指针变量后, 系统为其分配存储空间, 用以存放
其他变量的地址, 但在对指针变量赋值前, 它并没有
确定的值, 也不指向一个确定的变量 例: int x , *p ;
x=5; 注: 指针变量p的值是随机值,
2012 1234
p
1010 5 x
此时p 和 x 并无关联
(3) 使指针变量指向一个确定的变量必须进行赋值
#include <stdio.h>
b
void swap( int x , int y)
{ int temp;
temp = x ;
x = y;
y = temp;
}
void main( )
{ int a , b ;
scanf(“%d%d”,&a, &b);
if (a<b) swap(a , b);
printf(“a=%d, b=%d\n”, a, b);
(3) 指针变量: 存放变量地址的变量, 它用来指向另一个变量
二、 指针变量的定义
1. 格式 : 数据类型 * 指针变量名 ;
例 int *p1 ;
char *p2 ;
2. 说明 :
(1) 在变量定义时, * 号表示该变量是指针变量
( 注意: 指针变量是p1 , p2 , 不是*p1 , *p2 )