Day6指针专题(一)
指针
1.C程序设计中使用指针可以:
(1)使程序简洁、紧凑、高效
(2)有效的表示复杂的数据结构
(3)动态分配内存
(4)得到多于一个的函数返回值
2.在计算机内存中,每个字节单元(1Byte=8Bits)都有一个编号称为地址;在C语言中,内存单元的地址称为指针,专门用来存放地址的变量称为指针变量。在不影响理解的情况下,有时对地址、指针和指针变量不区分统称指针。
3.指针变量的说明:
(1)一般形式:
<存储类型> <数据类型> * <指针变量名>
例:
char * pName ;
注:
① 指针的存储类型是指指针变量本身的数据类型
② 指针说明时指定的数据类型不是指针变量本身的数据类型,而是指针目标的数据类型。简称指针的数据类型。
(2)指针在说明时也可以被赋予初值,称为指着的初始化
一般形式:
<存储类型> <数据类型> * <指针变量名> = <地址量>
例:
int a = 10 ;
int a , *pa = &a ; //int *pa ; pa = &a ;
//在上面的语句中,把变量a的地址作为初值赋予了刚说明的int型指针pa
例:
4.指针变量的使用
(1)指针指向的内存区域中的数据称为指针的目标,如果它指向的区域是程序中的一个变量的内存空间,则这个变量称为指针的目标变量,简称指针的目标(指针指向的地址空间里存放的数据)
*pa = *(&a) = a (通过“*”号可以找到指针的目标,即指针目标区域里存放的数据)
引用指针要注意程序中的pa、*pa、&pa三种表示方法的不同意义。设pa为一个指针则:
①pa——指针变量,它的内容是地址
②*pa——指针所指向的对象,它的内容是指针目标的数据
③&pa——指针变量占用的存储区域的地址,即存储指针变量的地址,是个常量
(2)指针的赋值运算是指通过赋值运算符向指针变量赋予的一个地址值,向一个指针变量赋值时,赋予的值必须是地址常量或者指针变量,不能是普通的整数(零除外)。
指针赋值运算,常见的形式有以下几种:
①把一个普通变量的地址赋给一个具有相同数据类型的指针
double x = 15.0 , *px ;
px = &x ;
②把一个已有地址值的指针变量赋给具有相同数据类型的另一个指针变量
float a , *px , *py ;
px = &a ;
py = px ;
③把一个数组的地址赋值给具有相同数据类型的指针
int a[20] ,*pa ;
pa = a ; //等价于pa = &a[0] ;
例:
#include <stdio.h>
int main(int argc, char *argv[])
{
int a = 10;
int * p;
int * q;
p = &a;
//q = &a;
q = p;
printf("&p:%p %d\n", &p, sizeof(p));
printf("%p %p\n", p, &a);
printf("%d %d\n", a, *p);
printf("\n\n&q:%p %d\n", &q, sizeof(q));
printf("%p %d\n", q, *q);
return 0;
}
指针运算
指针运算是以指针变量所存放的地址量作为运算量而进行的运算。
指针运算实质就是地址的运算。
指针运算的种类是有限的,它只能进行赋值运算、算术运算和关系运算。
1.指针的算术运算
注:
① 不同数据类型的两个指针实行加减整数运算是无意义的
② px+n表示实际位置的地址量是:(px) + sizeof(px的数据类型) *n ;px-n表示实际位置的地址量是:(px) - sizeof(px的数据类型) *n
③ 两指针相减运算,px-py运算的结果是两指针指向地址位置之间相隔数据的个数,因此,两指针相减不是两指针持有地址量相减的结果。即两指针相减的结果值不是地址量,而是一个整数值,表示两指针之间相隔数据个数。
例:
#include <stdio.h>
int main(int argc, char *argv[])
{
int a[5] = {
4, 8, 1, 2, 7};
int *p, * q;
p = a; //&a[0];
q = &a[3];
printf("%p %p\n", p, q);
printf("%d %d\n", *p, *q);
printf("%d\n",</