null第六章 指针第六章 指针C++程序
中使用指针可以:
使程序简洁、紧凑、高效
有效地
示复杂的数据结构
动态分配内存
得到多于一个的函数返回值6.1 指针的基本概念程序中: int i;
float k; 内存中每个字节有一个编号-----地址 i
k 编译或函数调用时为其分配内存单元变量是对程序中数据
存储空间的抽象1. 变量与地址6.1 指针的基本概念2. 指针与指针变量指针:一个变量的地址,它是一个整数形式的常量。
指针变量:专门用来存放地址的变量叫指针变量,它的值也可以是数组或函数的地址 。2000指针指针变量 变量的内容 变量的地址2. 指针与指针变量3. 取地址运算符&与指针运算符*含义: 取变量的地址
单目运算符
优先级: 14(第二高的级别)
结合性:自右向左含义: 从某个地址中获取数据
单目运算符
优先级: 14
结合性:自右向左两者关系:互为逆运算3. 取地址运算符&与指针运算符*指针运算符示例i_pointer-----指针变量,它的内容是地址量2000
*i_pointer----指针的目标变量i,它的内容是数据10
&i_pointer---指针变量占用内存的地址:2004i_pointer &i &(*i_pointer)
i *i_pointer *(&i)指针运算符示例4. 直接访问与间接访问例 i=3; -----直接访问3例 *i_pointer=20; -----间接访问20直接访问:按变量地址存取变量值
间接访问:通过存放变量地址的变量去访问变量4. 直接访问与间接访问6.2 指针变量的定义与引用1. 指针变量与其所指向的变量之间的关系2. 指针变量的定义
一般形式: [存储类型] 数据类型 *指针名;合法标识符指针变量本身的存储类型指针的目标变量的数据类型表示定义指针变量
不是乘法运算符*例 int *p1,*p2;
float *q ;
static char *name;注意:
1、int *p1, *p2; 与 int *p1, p2;不一样。
2、指针变量名是p1,p2 ,不是*p1,*p2。
3、指针变量只能指向定义时所规定类型的变量。
4、指针变量定义后,变量值不确定,应用前必须先赋值。6.2 指针变量的定义与引用3.对指针变量的操作将地址值赋给指针变量例 int i;
int *p=&i;变量必须已说明过;
并要求两者类型一致。例 int i;
int *p=&i;
int *q=p;用已初始化指针变量作初值例 main( )
{ int i;
static int *p=&i; ()
..............
}不能用auto变量的地址
去初始化static型指针一般形式:[存储类型] 数据类型 *指针名=初始地址值;3.对指针变量的操作(1) 指针变量的初始化3.对指针变量的操作(续)3.对指针变量的操作(续)(2) 指针变量 +/- 整数新的地址int a,b,c,d,*p,*q;
p=&b;
q=p+1; 所加的数值:整数*字节数
q=p-1;
p++; ++p;
注意:*p++; *++p;
不同于 (*p)++; ++ (*p);(3) 指针变量 - 指针变量
整数(多少个数)
q-p 1;(4) 关系运算
p
a=5,b=9
max=9,min=55200892010200820102008例6.3 按先大后小的顺序输出a和b两个整数。 7. 多重指针 7. 多重指针 一个指针变量的内容就是内存中某个存储区域的地址,这个存储区域中存放的值可以是一个基本数据类型的数据,也可以是另一个存储区域的地址。我们把这种类型的指针叫做多重指针。二重指针(指向指针的指针)的一般说明形式为:
类型说明符 **指针变量名;二重指针的使用。
main()
{ int *p1, **p2, i = 10;
p1=&i; p2=&p1;
}6.3 函数之间地址值的传递void swap(int x,int y)
{ int temp;
temp=x;
x=y;
y=temp;
}
void main()
{ int a=10,b=20;
if(a参数
)例6.5 将数从大到小输出(用指针作函数的参数)void swap(int *p1, int *p2)
{ int p;
p=*p1;
*p1=*p2;
*p2=p;
}
main()
{ int a,b;
int *pointer_1,*pointer_2;
a=5; b=9;
pointer_1=&a; pointer_2=&b;
if(a
>a>>b;
pointer_1=&a; pointer_2=&b;
if(a>a>>b;
pointer_1=&a; pointer_2=&b;
if(a>*p;
p=a; inv(p,10);
cout<<"The array has been reverted:\n";
for(p=a;p>*p;
p=a; inv(p,10);
cout<<"The array has been reverted:\n";
for(p=arr;p0) k=j;
if(k!=i)
{ temp=name[i]; name[i]=name[k]; name[k]=temp;}
}
}例 对字符串排序void print(char *name[],int n)
{ int i=0;
char *p;
/*p=name[0];*/
while(iy) z=x;
else z=y;
return(z);
}main()
{ int max(int ,int), (*p)();
int a,b,c;
p=max;
scanf("%d,%d",&a,&b);
c=(*p)(a,b);
printf("a=%d,b=%d,max=%d\n",a,b,c);
}
int max(int x,int y)
{ int z;
if(x>y) z=x;
else z=y;
return(z);
}1. 用指向函数的指针变量调用函数2. 用指向函数的指针变量作函数参数例 用函数指针变量作参数,求最大值、最小值和两数之和2. 用指向函数的指针变量作函数参数3. 返回指针值的函数函数定义形式:
类型标识符 *函数名(参数表);
例 int *f(int x, int y)3. 返回指针值的函数例 用指针函数实现:有若干学生成绩,要求输入学生序号后,能输出其全部成绩。main()
{ float score[][4]={{60,70,80,90},
{56,89,67,88},{34,78,90,66}};
float *search(float (*pointer)[4],int n), *p;
int i,m;
printf("Enter the number of student:");
scanf("%d",&m);
printf("The scores of No.%d are:\n",m);
p=search(score,m);
for(i=0;i<4;i++)
printf("%5.2f\t",*(p+i));
}
float *search(float (*pointer)[4], int n)
{ float *pt;
pt=*(pointer+n);
return(pt);
}6.6 有关指针操作的小结1.指针变量是把其它变量的地址作为内容的变量。指针变量的内容可以是0、NULL和一个确定的地址。
2. 地址运算符(&) 返回其操作数的地址。
地址运算符的操作数必须是一个变量(或数组元素)。
3. 指针运算符(*) 又称为“间接引用运算符” ,它表示从相应的存储单元中获取某种类型的数据值。
4. 指针±整数
5. 指针1-指针2
6. 指针的关系运算,如:指针1<指针2
7. 在调用带有参数的函数时,如果调用函数要求被调用函数修改参数的值,应该把参数的地址传递给被调用函数,被调用函数用间接引用运算符(*)修改调用函数中的参数的值。6.6 有关指针操作的小结指针的数据类型指针的数据类型第十章 作业例 下列定义的含义
(1)int *p[3];
(2)int (*p)[3];
(3)int *p(int);
(4)int (*p)(int);
(5)int *(*p)(int);
(6)int (*p[3])(int);
(7)int *(*p[3])(int);第十章 作业