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还读写什么呢?

总结

指针并不难。

目录
相关文章
|
5天前
|
C语言
C语言指针带代码
C语言指针带代码
16 3
|
7天前
|
C语言
C语言中返回指针值的函数
C语言中返回指针值的函数
16 0
|
3天前
|
C++ 存储 Java
C++ 引用和指针:内存地址、创建方法及应用解析
'markdown'C++ 中的引用是现有变量的别名,用 `&` 创建。例如:`string &meal = food;`。指针通过 `&` 获取变量内存地址,用 `*` 创建。指针变量存储地址,如 `string *ptr = &food;`。引用不可为空且不可变,指针可为空且可变,适用于动态内存和复杂数据结构。两者在函数参数传递和效率提升方面各有优势。 ```
|
5天前
|
存储 C语言
深入理解C语言中的指针
深入理解C语言中的指针
13 0
|
7天前
|
程序员 C语言
使用指针变量作为函数参数的C语言程序实例
使用指针变量作为函数参数的C语言程序实例
15 0
|
7天前
|
存储 程序员 C语言
C语言指针变量的深入解析与应用
C语言指针变量的深入解析与应用
13 0
|
7天前
|
存储 安全 编译器
C语言指针与数组
C语言指针与数组
12 0
|
7天前
|
C语言
C语言指针与字符串
C语言指针与字符串
10 0
|
7天前
|
存储 C语言
C语言中的指针数组与多重指针
C语言中的指针数组与多重指针
14 0
|
7天前
|
存储 C语言 开发者
C语言中的函数指针
C语言中的函数指针