!!!注意:因为简书的显示格式缘故,所以“ * ”显示会出现问题,可能有些星号由于疏忽未改动格式,造成没有显示,请多多包含,如有错误,请留言或联系本人更正,谢谢!
-
地址和指针的概念
- 地址:内存区的每一个字节有一个编号,这就是“地址” 。
- 指针:知道了一个变量的地址,就可以通过这个地址来访问这个变量,因此,又把变量的地址称为该变量的“指针” 。
假设我们需要存储一个值5,我们有2种方式:
1)int i = 5;/直接存储,通过定义变量i, 然后将5赋给i,即直接将5存储在i的内存空间中。/
2) int * i_pointer, i = 5; /定义指针变量i_pointer, 通过定义变量i, 然后将5赋给i,即直接将5存储在i的内存空间 /
i_pointer = &i; / 将i的地址赋给i_pointer,即i_pointer的内存空间内存储的是i的地址。“&”为取地址符。/
printf(“指针i_pointer所指向的值是:%d”, * i_pointer); /* 这里分为2步,第一步,取出i_pointer中存储的i的地址,第二部,取出i中存储的值5。“ * ”为取值操作符。*/ -
指针和指针变量
- 指针:知道了一个变量的地址,就可以通过这个地址来访问这个变量,因此,又把变量的地址称为该变量的“指针” 。
- 指针变量:C语言中可以定义一类特殊的变量,这些变量专门用来存放变量的地址,称为指针变量。(即该变量存储的值是地址)
- 指针变量的一般形式:类型说明符 变量名;(表示这是一个指针变量,变量名即为定义的指针变量名,类型说明符表示本指针变量所指向的变量的数据类型。且需注意,指针变量的类型说明符必须与所指向的变量的数据类型完全一致!!!)
注意: 指针变量中只能存放指针(即地址)!!!
“&”(取地址操作符)和“ * ”(取值操作符)详解
如果已执行了语句 pointer_1 = &a;
(1)&* pointer_1的含义:“&”和“”两个运算符的优先级别相同, 但按自右而左方向结合,因此先进行 * pointer_1的运算,它就是变量a,再执行&运算。因此, & * pointer_1与&a相同,即变量a的地址。(注意,假如这里将5赋值给a, 在函数执行过程中,只要a没有被释放,则a就指代5,而5并不一定指代a)
(2) * &a的含义是什么?先进行&a运算,得a的地址,再进行 * 运算。即&a所指向的变量,也就是变量a 。 &a和* pointer_1的作用是一样的,它们都等价于变量a。即*&a与a等价。
(3)( * pointer_1)++相当于a++。注意括号是必要的,如果没有括号,就成为了 * pointer_1++,因为,++和 * 为同一优先级别,而结合方向为自右而左,因此它相当于 * (pointer_1++)。
//例1
/#include <stdio.h>
void swap(int *p1, int *p2);void main()
{
int a, b;
int *pointer_1, *pointer_2;
scanf("%d %d", &a, &b);
pointer_1 = &a;
pointer_2 = &b;if(a < b)
{
swap(pointer_1, pointer_2); //如果a<b,则执行swap实现交换
}
printf("\nThe first way to ouput is: %d > %d\n", a, b);
printf("The second way to output is: %d > %d\n", *pointer_1, *pointer_2);
}void swap(int *p1, int *p2)
{
int temp;
temp = *p1; //temp = a;
*p1 = *p2; //a = b;
*p2 = temp; //b = temp;
}
//输入: 5 99
输出: The first way to ouput is: 99 > 5 //变量a原本指向的地址是存储5的内存空间,变量b原本指向的地址是存9的内存空间;经过swap之后,变量a与变量b所指向的内存空间发生转换,所以导致输出的值发生变化。
The second way to output is: 99 > 5 //指针变量 pointer_1和 pointer_2,存储的是变量a和变量b的地址,当a和b的地址发生转换后, pointer_1和 pointer_2所存储的地址也发生变化。