欢迎访问C语言3分钟系列。花3分钟时间,学习或温习一个C语言知识点。今天是第1篇。

C语言指针入门讲解,简单易懂C语言指针,指针为何需要指定数据类型,3分钟温习一个小知识_运算符

今天我们来讨论一下c语言的指针

C语言指针入门讲解,简单易懂C语言指针,指针为何需要指定数据类型,3分钟温习一个小知识_运算符_02


指针的引入

变量有四种概念其中包含:类型、变量名、内存地址、值。

指针其实就是地址的别名:指针==地址

比如说,我们去女朋友订的酒店,可以通过酒店名(变量名)来寻找或者直接通过酒店的地址来查找两种方式。

以下我们来做个简单的例子:

// 我们可以通过变量名来访问
#include <stdio.h>
int main()
{
    int a = 10;
    printf("a=%d\n",a);
    printf("a的地址是:0x%p\n",&a);
    printf("a=%d\n",*(&a));
    return 0 ;
}

指针变量的引入

指针变量

什么是指针变量;C语言中存放地址的变量被称为指针变量

怎么利用一个指针变量来访问值:

#include <stdio.h>
int main()
{
    int a = 10;
    int *p = &a;
    printf("通过指针变量访问:%d\n",*p);
    return 0 ;
}

其中&为取地址运算符;*可理解为将地址内的值读出的运算符

通过上述代码,我们都能在屏幕中打印出变量a的值

指针变量为什么要求类型

但是,我们发现,我们定义的指针变量类型都是定义的int型,那我们能不能把它改成char型呢?

我们通过代码实验一下:

#include <stdio.h>
int main()
{
    int a = 0x1234;
    int *p = &a;
    char *c = &a;
    
    printf("p = %p",p);
    printf("c = %p",c);
    
    printf("a = %x",*p);
    printf("a = %x",*c);
    return 0;
 }
 
  // 结果如下:
  // 地址打印出来是一样的
  // 通过p指针打印的是1234;
  // 通过c指针打印出来的结果为34
  //编译运行程序可以看到,通过p指针取a的值能够正确,但是通过c指针,结果却显示不全

造成这样结果的原因是,在取值*运算符会根据指针变量的类型访问不同大小的空间int *型能够访问完整的32个字节(4Byte*8位),而char *型只能访问1个Byte(8位),于是就只能访问到低位2位16进制数字。而高出的24位全部被忽略。

如此我们也可以通过进行自增运算,看看他们相差多少

#include <stdio.h>
int main()
{
    int a = 0x1234;
    int *p = &a;
    char *c = &a;
    
    printf("p = %p",p);
    printf("c = %p",c);
    
    printf("p = %p",++p);
    printf("c = %p",++c);
    return 0;
 }

运行结果如下:

C语言指针入门讲解,简单易懂C语言指针,指针为何需要指定数据类型,3分钟温习一个小知识_指针变量_03

通过结果我们发现p指针跨越正好是4个Byte,而c指针是1个Byte

总结

指针就是地址的别称,指针的类型在存放指针时并不会有什么影响,但是在通过*运算符取值时,会根据不同的数据类型分配不同大小的内存空间。如果你希望我更新某个特定小知识,欢迎给我留言。

我是坏柠,聊编程,聊程序员人生

C语言指针入门讲解,简单易懂C语言指针,指针为何需要指定数据类型,3分钟温习一个小知识_指针变量_04