C语言--指针的学习(一)

1300阅读 0评论2013-01-26 行健天下ing
分类:C/C++

一、指针的初探

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作为指针名的第一个字母。




上一篇:socket和send系统调用协议栈工作流程
下一篇:OpenSSH移植到ARM Platform——特指启动SSHD服务