指针 [1] —— 变量的访问、指针的声明以及指针的使用

文章转载请注明出处,加上原文链接,谢谢!https://blog.csdn.net/weixin_46959681/article/details/111662554



变量的访问

变量的访问方式:

  • 变量名:直接访问变量名获取原始数据。
  • 地址:使用取地址运算符“&”取变量名所代表的变量的内存地址。
  • 使用符号 %p打印地址,使用符号 * 获取原始数据。

代码实现:

#include <stdio.h>
int main()
{
    
    
	int a = 10;
	int b = 20;

	//通过变量名 a、b 直接访问原始数据。
	printf("a = %d\n", a);
	printf("b = %d\n", b);

	//通过取地址符 & 取变量名的内存地址,以 %p 打印出地址。
	printf("a的地址为 %p\n", &a);
	printf("b的地址为 %p\n", &b);	

	//通过取地址符 & 取地址,再用间接寻址运算符 * 获取原始数据。
	printf("通过地址来获取原始数据 a = %d\n", *(&a));
	printf("通过地址来获取原始数据 b = %d\n", *(&b));	
	return 0;
}

运行以上的代码,我们通过不同的方式实现了变量的访问,获取了原始数据。同以上方式一样,指针也只是操纵数据的一种方式

注意⚠️:所谓指针,也就是内存的地址;所谓指针变量,也就是保存了内存地址的变量。但是人们往往不会区分两者的概念,而是混淆在一起使用。在学习的过程中,什么是变量?什么是原始数据?什么是地址?这三者之间的关系互有交集,在学习的时候必须理清概念的边界范围。


指针变量的声明

对指针变量的声明与对普通变量的声明基本类似,唯一的不同在于指针变量名字前必须放置星号 * ,并且要求每个指针变量只能指向一种特定类型(引用类型)的对象,例如:

int *p;  //一个整型的指针。
char *q; //一个字符型的指针。
float *f; //一个浮点型的指针。

声明指针是为了给指针留出空间,但是并没有把它指向对象。使用指针前必须进行初始化,即使用取地址符 & 把某个变量的地址赋给它。

int *p; //指针声明。
p = &i; //初始化p。 

int i, *p = &i; //亦或合并, i 必须先声明。

这里可以延伸出一个问题,即些许人会认为指针声明时, int *p = &ip = &i 不一致,为什在语句 p = &i 没有像其在声明中那样前面加上* 号呢?

造成困惑的原因在于,根据使用上下文的不同,C语言中的* 号可以有多种含义。在声明 int *p = &i; 中, *不是间接寻址运算符,其作用是指明p的类型以便告知编译器p是一个指向 int 类型变量的指针,而在语句中出现时,*号(作为一元运算符使用时)会执行间接寻址。语句 *p = &i; 是不正确的,因为它把i的地址赋给了p指向的对象,而不是p本身。

小贴士:问题与解答来自《C语言程序设计现代方法(第2版)》P180

另外,指针变量可以和其他变量一起出现在声明中:

int.i, a[5], *p, ;

注意⚠️:整型变量存放的是整数,字符变量存放的是字符,数组存放的是一串数据。指针变量存放的是地址。 只有在定义一个指针变量的时候,符号 * 才是一个指针标识符。其他任何时候都是一个运算符,其功能是取出内存地址中的原始数据。(一级指针:存放普通变量的地址,二级指针存放的是一级指针变量的地址。


使用指针

使用指针时会频繁进行如下的几个操作:

  1. 定义一个指针变量;
  2. 把变量地址赋值给指针;
  3. 访问指针变量中可用的地址。

下面我们进行两个实例,帮助大家理解。

|指针的地址

#include <stdio.h>
int main(){
    
    
	
	int a = 10;
	int *p;
	p = &a;
	
	printf(" the value of &a : %p\n", &a); //指针中存储的地址。
	printf(" the value of p : %p\n", p);
	printf(" the value of a : %d\n", a); 
	printf(" the value of a : %d\n", *p); //使用指针访问变量内容。
	getchar();
	return 0;
}

|使用指针找出数组中最大值和最小值

在该小节中使用名为 max_min.c 的程序并在函数中传递指针,使该函数能找出数组中的最大元素和最小元素。

#include <stdio.h>
#define N 10

void max_min(int a[], int n, int *max, int *min)
{
    
    
	int i;
	*max = *min = a[0];
	for(i = 1; i < n; i++){
    
    
		if(a[i] > *max)  
			*max = a[i];
		else if(a[i] < *min)
			*min = a[i]
	}
}

int main()
{
    
    	
	int b[N], i, big, small;
	
	printf("Enter %d numbers:", N);
	for(i = 0; i < N; i++)
		scanf("%d", &b[i]);
	
	max_min(b, N, &big, &small); //使用指针传参。

	printf("Largest: %d\n", big);
	printf("Smallest: %d\n", small);	
	return 0;
}

代码抄录自《C程序语言设计现代方法(第2版)》 P178


文章更新记录

  • 文章初步完成。 「2020.12.25 16:49」
  • 增加 —— 问题与解答 P180。 「2020.12.26 10:35」

猜你喜欢

转载自blog.csdn.net/weixin_46959681/article/details/111662554