c语言中的指针

原创 2015年07月08日 00:44:12

c语言中的指针

标签(空格分隔): c

前言

指针是c语言的灵魂,基本学没学好c语言就看指针了,又因为指针很难,所以学习起来都是模模糊糊的。这一篇仔细学一下它。希望能比能再搞懂一点。

直接引用和间接引用

在说啥是指针之前,先把这2个概念搞清楚。

直接引用就是对一个变量自身的赋值和取值,自给自足,不麻烦别人。

char a;
a = 12; //直接引用赋值
printf("%d", a) //直接引用取值

如图所示:
这里写图片描述

间接引用呢,比较作死,就是我想读取或者写入一个变量a的值,我是通过变量b来实现。b里面存放的是a的地址,通过操作b来间接操作a

这里写图片描述

好,搞清楚了b里面存放的是a的地址了,的这一种方式,叫间接引用,好,那开始说指针。

指针

指针定义

指针就是干着间接引用的活儿,你申明了一个指针变量,它存放的是其他变量的首地址。

首地址是指一个变量最开始的占用空间字节的位置地址。如果,一个字符类型char,它就占1个字节的内存,那么首地址就是它自身的地址。如果,一个字符串类型占用4个字节,那么首地址就是第1个字节的地址。

字符类型在16位编译环境下占1个字节,指针的存储:

字符串数组类型在16位下占3个字节,首地址就是第一个字节的地址。指针的存储:

如何定义一个指针变量呢?用变量类型 + * + 指针名 组合起来,对比于单纯的变量的申明,其实就多了一个*号。

int *p;
char *b;

上面就申明了2个指针变量,整型指针p, 字符指针b*是一个说明符,用来说明这个变量是个指针变量,是不能省略的,但它不属于变量名的一部分。

由于指针里存放的是变量的地址,任何变量,不管它是啥类型,它都会拆分依次存放在内存中,首地址都是固定的一个长度,所以,指针占用相同的存储空间,与指向的变量的数据类型无关,只与编译器环境有关:

此处输入图片的描述

指针初始化赋值

指针定义好了之后,就要给它赋值,前面说了,指针存的是一个变量的首地址,那么,我们给指针赋值,就是把这个变量的首地址赋给它。也就是指针指向这个变量。

取地址用&符号表示。一个变量前加一个&就表示,取出这个变量在内存中的地址。

char a = 10;
char *p;
p = &a; //将a的地址取出来赋给p

要注意的是:定义一个指针的类型要和它指向的那个变量的类型要一致。

可以定义指针和赋值一起:

char a = 10;
char *p = &a; //一起

这样,指针p就指向整型变量a了,那么,a的命运完全就由p来掌控了,哈哈哈哈。

用图来表示,就是:
此处输入图片的描述

指针的取值

指针的取值,是指取出指针所指向地址的空间的值,用符号*来表示取出一个指针指向的变量的值。

char a = 10;
char *p = &a;
int value = *p; //value =10  *p 表示取出p指向的地址的值

注意:第三行的*是最容易的搞混的。很容易与定义指针变量的那个*搞混淆。这里的*是一个指针运算符,*p表示根据p这个地址访问对应的存储空间,也就是变a的存储空间的值,也就是取出10:

此处输入图片的描述

所以,我们也可以用这种方式,给指针所指的变量重新赋值:

char a = 10;
char *p = &a;
*p = 9; //将指针p值所指向的指针的访问空间值改成20。也就是a变成9了。

所以,是有个顺序的:

  1. 定义一个指针变量p: int *p
  2. 将这个指针p指向变量a: p = &a;
  3. 改变a的值: *p = 9;

三步取一不可。

用图表示就是:

值得注意的是 : 和初始化指针一样,指针存的是变量的首地址,*p取的是也是首地址的存储空间的值,如果是字符形,由于只占1个字节,所以*p取到的值就是这个变量的值。如果是字符串数组char[] = "qwe",那么*p取到的就是首地址的值,也就是第一个字节的地址对应的值,也就是取到的是字符串的第一个字符q。

下面讲字符串,数组和指针的关系会重点说。

指针的用途

说了这么久。指针到底有啥用途呢,由于指针指向一个元素的地址,所以,指针最大的用途就是改变这个变量的值,并且快速移动指针。

举了例子,函数中形参和实参的例子,一半形参不管怎么变,一半来说,实参是不受影响的,下面是交换2个变量的值:

void swap(char v1, char v2) {
    printf("更换前:v1=%d, v2=%d\n", v1, v2);

    // 定义一个中间变量
    char temp;

    // 交换v1和v2的值
    temp = v1;
    v1 = v2;
    v2 = temp;

    printf("更换后:v1=%d, v2=%d\n", v1, v2);
}

int main()
{
    char a = 10, b = 9;
    printf("更换前:a=%d, b=%d\n", a, b);

    swap(a, b);

    printf("更换后:a=%d, b=%d", a, b);
    return 0;
}

运行如下:

你看,其实并没有交换。那么现在就可以指针,因为,指针指向地址:

void swap(char *v1, char *v2) {
    // 中间变量
    char temp;

    // 取出v1指向的变量的值
    temp = *v1;

    // 取出v2指向的变量的值,然后赋值给v1指向的变量
    *v1 = *v2;

    // 赋值给v2指向的变量
    *v2 = temp;
}

int main()
{
    char a = 10, b = 9;
    printf("更换前:a=%d, b=%d\n", a, b);

    swap(&a, &b);

    printf("更换后:a=%d, b=%d", a, b);
    return 0;
}

运行如下:

相关文章推荐

C语言实验报告(指针(一))

  • 2017年11月11日 18:28
  • 19KB
  • 下载

最全的C语言指针详解

  • 2017年11月15日 15:06
  • 703KB
  • 下载

c语言面试题 指针30个常错题型

来源:http://blog.chinaunix.net/u1/58640/showart.php?id=1354073 记下来以备不时之需。 1. char * const p; char cons...

c语言指针的初步学习与详解

  • 2015年11月20日 12:13
  • 1.05MB
  • 下载

C语言函数指针.doc

  • 2015年08月04日 11:36
  • 35KB
  • 下载

[c语言]通过指针获取函数内部变量值

在C语言,函数中声明的变量都是临时的,局部的变量,在函数执行结束后,这些局部变量会消失,局部变量占据的内存也会释放。那么如何在函数执行结束前将我们需要的临时变量输出到函数外?通常的情况是这样的,举个例...

C语言指针详细课程

  • 2015年02月03日 21:20
  • 573KB
  • 下载

c语言指针式钟表(graphics.h头文件画)

  • 2017年06月24日 22:25
  • 41.05MB
  • 下载

JNA调用C语言动态链接库学习实践总结(指针模拟)

最新因为项目需要,学习了一下JNA框架,在这里记录一下学习和使用心得,给大家分享,希望能帮助新手。 本文主要讲解如何使用JNA框架轻松调用C语言动态链接库,如何使用JNA模拟C语言参数(例如数组、指...

C语言数组和指针

  • 2017年08月05日 09:47
  • 2KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:c语言中的指针
举报原因:
原因补充:

(最多只允许输入30个字)