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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值