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

比眉伴天荒 2022-08-07 01:51 329阅读 0赞

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

可以说,指针是现代编程语言的一个基本且重要的概念和知识点。对于现在流行的计算机语言,只有理解了指针的概念和熟练运用后,才能学好它(包括C/C++、JAVA、C#等)。虽然JAVA中并没有指针这个名词,但它实际上是存在指针的。

废话少说,相信大多数看官都是想直接看一看C语言的指针是什么了。首先看下面的代码:

  1. int i=1;

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

Center

下面声明一个指针:

  1. int *p;

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

指针变量和一般的变量可以在同一行声明:

  1. int *p,j;

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

  1. int *p1,*p2;

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

  1. int* p;

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

  1. *p;

这样的声明是无效的。

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

  1. int i=1;
  2. int *p;//also int *p=&i
  3. p=&i;

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

Center 1

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

下面的语句打印指针变量的内容:

  1. #include<stdio.h>
  2. int main()
  3. {
  4. int i = 0;
  5. int *p = &i;
  6. printf_s("%p",p);
  7. return 0;
  8. }

指针的英文名称是pointer,所以打印指针时是用”%p”来控制格式的。

printf_s()函数是VC编译器的安全printf()函数版本。输出是:

“0021FA48”

你的输出结果可能会和这个不一样,但它必定是一个8位的16进制串。这里一个16进制占4位,8个刚好是32位(4字节)。

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

为了通过指针而操作变量本身,必再次使用*运算符。这里*称作间接寻址运算符。在上面用到*的地方仅仅是将变量声明为指针型变量,对于一个已经赋值的指针,我们可以通过*号结合指针变量本身来操作原始的变量内容,如下所示:

*p

修改上面的程序如下:

  1. #include<stdio.h>
  2. int main()
  3. {
  4. int i = 0;
  5. int *p = &i;
  6. printf_s("%d在内存中的地址是%p",*p, p);
  7. return 0;
  8. }

输出如下:

Center 2

可以见到这里的地址又不一样了,因为每程序运行都会为变量赋于新的地址。可以见到,*p又指向了内容本身。同时还可以进行加减运算:

修改打印语句:

  1. printf_s("%d在内存中的地址是%p:一些运算\d__->%d,%d",*p,p,*p+1,*p-1);

在对指针进行运算时,必须要谨记运算符的优先顺序和结合顺序,不然很容易就会出错,至少得到和结果并不是我们想要的。

下面修改了一下程序,各位看官自己运行一下吧。

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

最后

C语言指针系列文章一共有五篇,至于什么能完成,就看时间允不允许了。

《C语言指针二——指针与数组》

《C语言指针三——指针运算本质》

《C语言指针四——指针与函数》

《C语言指针五——指针应用:链表》

发表评论

表情:
评论列表 (有 0 条评论,329人围观)

还没有评论,来说两句吧...

相关阅读

    相关 指针1C语言

    目录 1.指针是什么 2. 指针和指针类型 2.1 指针+-整数 2.2 指针的解引用 3. 野指针 3.1 野指针成因 1. 指针未初始化 2. 指针越界访问

    相关 C语言指针1

      计算机中所有的数据都必须放在内存中,不同类型的数据占用的字节数不一样,例如 int 占用4个字节,char 占用1个字节。为了正确地访问这些数据,必须为每个字节都编上号码

    相关 5/27 C语言 指针系列

    1、序。数据在内存中是如何存储的,又是如何读取的? 在程序中定义一个变量,在对程序进行编译的时候,系统会给这个变量分配内存单元。编译系统根据程序中定义变量类型,分配一定长度的