您的位置:首页 > 编程语言 > C语言/C++

C语言指针系列1——指针基本概念

2015-02-20 13:05 246 查看
C语言指针系列1——指针基本概念
可以说,指针是现代编程语言的一个基本且重要的概念和知识点。对于现在流行的计算机语言,只有理解了指针的概念和熟练运用后,才能学好它(包括C/C++、JAVA、C#等)。虽然JAVA中并没有指针这个名词,但它实际上是存在指针的。
废话少说,相信大多数看官都是想直接看一看C语言的指针是什么了。首先看下面的代码:

int i=1;


这句代码声明了一个整型变量,并且赋值为1。其内存快照如下(假设int型变量点4个字节)



下面声明一个指针:

int *p;


这是一个声明指针的一个经典方式(我喜欢另一种方式),首先上面的声明中带有一个*,它表明*号右边的变量名p是一个指针型变量,*号左边是一个类型标识符,它表明这个指针是一个指向整型的指针。
指针变量和一般的变量可以在同一行声明:

int *p,j;


一个*号只能声明一个指针型变量,离*号右边最近的那一个才是指针型变量,其则是一般型变量。要在一行中声明多个指针型变量,每个指针型变量前面必须要有一个*,如下所示:

int *p1,*p2;


同时,必须要认识到,*号的位置是无关紧要的,它可以和类型标识符结合在一起,如下所示:

int* p;


同时必须注意,类型标识符是必不可少的,因为指针必须要指向一个已知的类型,如

*p;


这样的声明是无效的。
末经初始化的指针并没有指向任何有效的内容,它不能使用。使用如下的方式对指针进行初始化:

int i=1;
int *p;//also int *p=&i
p=&i;


上面的语句首先声明并初始化了一个整型变量,然后又声明了一个指向整型变量的指针,利用取地址运算符将i在内存中的地址存放在p中。在上面的两个变量中,i存放的是数据内容本身,而p存放的是i的址。



p(指针)存放的是变量的地址,这是我们最常见的对指针的描述。事实上,像整型这样的变量,因为它在内存中占有4个字节,而每个字节都有一个内存地址,指针p实际保存的是变量的首(字节)地址。指针变量可以像普通的变量一样,可以打印出来。并且它在内存中同样占有存储空间,无论是指向什么类型的变量的指针,指针变量都是只占4个字节的内存空间。
下面的语句打印指针变量的内容:

#include<stdio.h>
int main()
{
int i = 0;
int *p = &i;
printf_s("%p",p);
return 0;
}


指针的英文名称是pointer,所以打印指针时是用”%p”来控制格式的。
printf_s()函数是VC编译器的安全printf()函数版本。输出是:
“0021FA48”
你的输出结果可能会和这个不一样,但它必定是一个8位的16进制串。这里一个16进制占4位,8个刚好是32位(4字节)。

——C和C++程序员更喜欢使用指针而非变量本身

为了通过指针而操作变量本身,必再次使用*运算符。这里*称作间接寻址运算符。在上面用到*的地方仅仅是将变量声明为指针型变量,对于一个已经赋值的指针,我们可以通过*号结合指针变量本身来操作原始的变量内容,如下所示:
*p
修改上面的程序如下:
#include<stdio.h>
int main()
{
int i = 0;
int *p = &i;
printf_s("%d在内存中的地址是%p",*p, p);
return 0;
}


输出如下:



可以见到这里的地址又不一样了,因为每程序运行都会为变量赋于新的地址。可以见到,*p又指向了内容本身。同时还可以进行加减运算:
修改打印语句:
printf_s("%d在内存中的地址是%p:一些运算\d__->%d,%d",*p,p,*p+1,*p-1);


在对指针进行运算时,必须要谨记运算符的优先顺序和结合顺序,不然很容易就会出错,至少得到和结果并不是我们想要的。
下面修改了一下程序,各位看官自己运行一下吧。

#include<stdio.h>
int main()
{
char i = 'L';
char *p = &i;
printf_s("%c在内存中的地址是%p:一些运算\d__->%d,%d",*p,p,*p+1,*p-1);
return 0;
}


最后
C语言指针系列文章一共有五篇,至于什么能完成,就看时间允不允许了。
《C语言指针二——指针与数组》
《C语言指针三——指针运算本质》
《C语言指针四——指针与函数》
《C语言指针五——指针应用:链表》
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: