40篇学完C语言——(第四篇)指针与地址

Posted xcc_21

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了40篇学完C语言——(第四篇)指针与地址相关的知识,希望对你有一定的参考价值。

前言

指针其实很简单。同C语言中其他变量一样,把指针也看成是一种变量即可,这种变量专门存储地址值

int a = 100;
int* b = &a;

上面的代码很清晰,a是一个整形变量,值为100;b是一个指针变量,值是变量a的地址。变量和指针的类型必须相同。

本文主要讲利用指针变量如何读写地址中的值。

正文

1、首先来假设一个场景:交换a和b两个变量的值。看下面的例子:

void swap(int x, int y)

    int tmp = x;
    x = y;
    y = tmp;    

void change()

    int a = 100;
    int b = 200;
    swap(a, b);

结果a,b的值并没有交换成功。原因是:C程序在调用函数时使用“按值调用”,这意味着变量的值直接从调用函数复制到被调函数的实参中,“按值调用”是C语言中调用函数的唯一方式。

2、C通过创建指针的方式解决上述问题。
尽管声明指针变量的形式稍微复杂一点点,指针就是个保存变量地址的变量而已。指针常见操作如下:

第一类:创建指针变量,“ 基本类型+ * ”。

int* iptr;
char* cptr;
double* dptr;

第二类:给指针变量赋值,“ &+变量 ”。

int a = 100;
char b = o;
double c = 100.5;

int* iptr;
char* cptr;
double* dptr;

iptr = &a;
cptr = &b;
dptr = &c;

第三类:取指针变量保存的地址中的值,“ * + 指针变量”。

int a = 100;
int* iptr = &a;
int b = *iptr;

于是,上面的代码改写成:

void swap(int* x, int* y)

    int tmp = *x;
    *x = *y;
    *y = tmp;   

void change()

    int a = 100;
    int b = 200;
    swap(&a, &b);

3、一个函数只能访问自己的栈帧。
但是,通过指针,一个函数可以间接地读写另一个栈帧中的变量值。
值得注意的是,函数之间利用指针读写是有方向的。如果函数F1调用F2,则F2可以读写F1中的变量值,反之不行。很好理解,F2得栈帧先出栈,出栈后变量都没有了,F1还读写什么呢?

总结

指针并不难。

以上是关于40篇学完C语言——(第四篇)指针与地址的主要内容,如果未能解决你的问题,请参考以下文章

DirectX11第四篇 Effects框架

C语言从青铜到王者第四篇·详解操作符

C语言从青铜到王者第四篇·详解操作符

C语言从青铜到王者第四篇·详解操作符

C++初阶第四篇——类和对象(上)(类的定义+封装+this指针)

一篇学完 Tomcat