一、指针的初探
1、指针 指针是C语言里最强大的工具之一,它也是最容易令人困惑的主题,所以一定要在开始的时候正确理解其概念,在深入学习指针时要对其操作有较清晰的认识。
在程序中使用变量名引用这块内存,但是一旦编译执行程序,计算机就使用内存位置的地址来引用它。
int number = 5;
这条语句会分配一块内存来存储一个整数,使用number可以来访问这个值。值5存储在这个区域中。计算机用一个地址引用这个区域。存储在这个数据的地址取决于所使用的计算机、操作系统和编译器。在源程序中,这个变量是固定不变的,但地址在不同的系统上是不同的。可以存储地址的变量称为指针(pointers),存储在指针中的地址通常是另一个变量。
2、声明指针 以下语句可以声明一个指向int类型变量的指针: int *pointer; pointer变量的类型是int *,它可以存储任意int类型变量的地址。这条语句创建了pointer,但是没有初始化它。未初始化的指针是非常危险的,所以就应总是在声明指针时对它进行初始化。应该是: int *pointer = NULL;初始化指针,使它不指向任何对象。NULL是在标准库中定义的一个常量,对于指针它表示0。NULL是一个不指向任何内存位置的值。这表示,使用不指向任何对象的指针,不会意外覆盖内存。
如果用已声明的变量地址初始化pointer变量,可以使用寻址运算符&,例如: int number = 10; int *pointer = &number; pointer的初始值是number变量的地址。注意,number的声明必须在pointer声明之前,否则,代码就不能编译。编译器需要先分配好空间,才能使用number的地址初始化pointer变量。
int *p,q; 上述语句声明了一个指针p和一个变量q,两者都是int类型。把p和q都当作指针是一个常见的错误。
3、通过指针访问值 使用间接运算符*可以访问指针所指的变量值。这个运算符也称为取消引用运算符,因为它用于取消对指针的引用。
试试看:
#include
int main(void)
{
int number = 0; int *pointer = NULL; //声明指针,并初始化;
number = 10; printf("\nnumber's address: %p", &number);
printf("\nnumber's value: %d\n\n", numbrer);
pointer = &number; //把number的地址存储在pointer中。注意,pointer只能存储地址。
printf("pointer's address: %p", &pointer); //输出pointer的地址,指针本身也有一个地址,就像变量一样。输出pointer所占内存位置的第一个字节。
printf("\nPointer's size: %d bytes", sizeof(pointer)); //使用sizeof来获得指针所占的字节数
printf("\npointer's Value: %p", pointer); //输出pointer所存储的number的地址
printf("\nvalue pointed to: %d\n", *pointer); //使用pointer访问存储在number中的值。*运算符的作用是访问存储在pointer地址的数据。
return 0;
}
输出如下:
number's address: 0xbfd7d400
number's value: 10 pointer's address: 0xbfd7d3fc
Pointer's size: 4 bytes
pointer's Value: 0xbfd7d400 value
pointed to: 10
4、scanf()与指针的使用
#include
int main(void)
{
int value = 0;
int *pvalue = NULL;
pvalue = &value;
printf("Input an integer:");
scanf("%d", pvalue);
printf("You entered %d\n", value);
return 0;
}
结果输出:
Input an integer:20
You entered 20
5、指向常量的指针
声明指针时,可以使用const关键字指定,该指针指向的值不能改变。
long value = 999L;
const long *pvalue = &value;
把pvalue指向的值声明为const,所以编译器会检查是否有语句试图修改pvalue指向的值,并将这些语句标记为错误。
6、常量指针
int count = 43;
int *const pcount = &count;
第二句声明并初始化了pnumber,指定该指针存储的地址不能改变。编译器会检查代码是否无意中把指针指向其他地方,所以下面的语句会在编译时出现错误信息:
int item = 34;
pcount = &item;
但使用pcount,仍可以改变pcount指向的值:
*pcount = 345;
这条语句通过指针引用了存储在count中的值,并将其改为 345.还可以直接使用count改变这个值。
可以创建一个常量指针,它指向一个常量值:
int item = 25;
const int *const pitem = &item;
pitem是 一个指向常量的常量指针,所以所有的信息都是固定不变的,不能改变存储在pitem中的地址,也不能使用pitem改变它的指向的内容。
7、指针的命名
在一些大的程序中,很难记住哪个是一般变量,那个是指针,因此,最好将p作为指针名的第一个字母。