C语言指针引用数组案例讲解

时间:2022-12-06

前言:C语言中指针玩的是什么,是内存,要想学好指针的小伙伴们要先对数据在内存中是怎么玩的做一番了解~

      当在程序中定义一个变量时,系统会根据其数据类型为其开辟内存空间,例如Visual C++为整型变量分配四个字节的空间,为单精度浮点型变量分配四个字节,为字符型变量分配一个字节,内存中每个字节都有自己独立且唯一的一个编号,这就是地址 ,如下图,系统为变量i分配了2000~2004的存储单元。

在这里插入图片描述

_访问变量的方式_有如下图两种:
第一种直接访问方式,直接通过变量名访问,变量名与地址有一一对应关系,因此按此地址直接对变量i的存储单元进行访问;
第二种间接访问方式,先通过i_pointer找到i的地址的位置,再通过i的所存地址的位置找到i的地址2000,随后对变量i进行存取操作。间接访问的方式就要用到指针,所谓指针(2000)即为一个变量的地址,指针变量(i_pointer)是存储这个地址的用来指向另一个对象的变量。

关键字 变量类型
int 整型变量
char 字符变量
类型名* 指针变量

它们之间的关系为:指针变量的值是指针,指针是变量i的地址,变量i存放所需要存放的存储内容。
图片的中*为取值运算符,*i_pointer表示对i_pointer中存放的地址进行取值,相当于 变量i。

在这里插入图片描述

指针的定义:

基类型 *变量名
例:int *p
char *p
float p
注意 : 此时的
与上文中提到的取值运算符并不是一个概念,此时的
*意思是定义一个变量,这个变量是指针变量。

指针的引用:

对指针进行赋值:
以下面程序为例:

int *p;
int a = 3;
p = &a;
*p = 2;

p = &a(&为取地址符,意思是取变量a的地址赋给指针变量P)
*p = 2(p上文中已经提到是对指针变量P中存储的地址进行取值p相当于变量a,对
*p进行赋值即相当于对变量a进行赋值)

指针变量做函数参数

以定义两个变量a和b,使其值进行交换为例进行阐述


#include<stdio.h>

//值传递
void swap1(int x, int y) {
	int z;
	z = x;
	x = y;
	y = z;
}

//地址传递 
void swap2(int *p1, int *p2) {
	int t = *p1;
	*p1 = *p2;
	*p2 = t;
}

/*
错误,指针变量t所指向的内容不可预见,对*t赋值就是向一个未知存储单元赋值 ,可能操纵到有用信息,
破坏系统的正常工作状态 ,这种指针叫做**野指针**;

那么如何解决野指针危险性呢:
可以对该指针进行初始化,使其指向NULL,NULL为地址为0的内存地址,在大多数操作系统上,该内存为操作系统保留,
用户不可操控  
*/ 
//void swap3(int *p1, int *p2) {
//	int *t;
//	*t = *p1;
//	p1 = *p2;	//报错 
//	p2 = *t;
/