C语言—指针介绍

指针的重要性

①表示一些复杂的数据结构;②快速传递数据;③使函数返回一个以上的值;
④直接访问硬件;⑤能方便处理字符串;⑥是理解面向对象语言中引用的基础;
总结:指针是C语言的灵魂

指针的定义

指针是一个变量,用来存放地址的变量。

★地址:
内存单元的编号
从零开始的非负整数
范围: 4G
★指针:
①指针就是地址,地址就是指针
②指针变量是存放地址的变量
③指针和指针变量是两个不同的概念
④叙述时通常把指针变量简称为指针,实际它们含义不一样
⑤指针的本质就是一个操作受限的非负整数

★指针,地址,指针变量之间的区别和联系:
指针就是地址,地址就是指针;
指针变量是一个变量,它保存了基本类型变量的地址。
如果指针变量p保存了变量a的地址,那么称作p指向了a,*p 就是变量a。
如果p是一个指针变量,*p 表示了以 p 的内容为地址的变量,就是p指向的变量。

这里列举一个简单的示例:

#include <stdio.h>
int main()
{
    
    
	int *p;  //p是变量的名字,int*表示p变量存放的是int类型变量的地址
			//int*p:不表示定义了一个名字叫做*p的变量
			//int*p:应该理解为: p是变量名,p变量的数据类型是int*类型,所谓int*类型,实际就是存放int变量地址的类型
	int a = 2;
	p = &a;  //1.p保存了a的地址,因此p指向a
			//2.p不是a,a也不是p,修改p的值不影响a的值,修改a的值也不影响p的值
			//3.如果一个指针变量指向了某个普通变量,则*指针变量完全等同于普通变量
			//例:若p指向a,则*p=a (*p 和a可互相替换)
	printf("*p的值为:%d\np保存的地址:%p\n",*p,p);
	printf("a的值为:%d\na的地址为:%p\n",a,&a);
	return 0;
}

我的运行结果:
在这里插入图片描述

指针的类型

(1)基本类型:int 、short、long、float 、double、char
如 int *p;//表示定义一个指针,这个指针指向整型变量,这个指针将存放的是整型变量的地址。

(2)数组指针:指针指向一个数组
int (*a)[10]; //表示指针指向一个int型的长度为10的数组

(3)函数指针:指针指向一个函数
void (*a)(); //表示指针指向一个无参数无返回值的函数

指针的运算

(1)指针+或者-一个数,表示指针加减这个数的类型所占内存的整数倍
如 int *p=a;
p=p+2; // 在VC6.0里面,实际上p加了2 * 4=8

(2)指针减去一个指针,表示两个指针之间所差的内存单元或者元素个数,两个指针相加没有意义

(3)关系运算,如果定义了两个指针变量p和q,并且都已经初始化了,
如果p==q,则表示p和q指向同一个地址
p>q,则表示p指向高地址而q指向低地址
也经常拿p和NULL做比较,用来表示指针当前的状态,这在数据结构中应用非常广泛,不如说链表的查找等等

指针和数组的关系

指针和数组关系密切,数组可以通过指针去引用,数组可以存放指针,数组也可以由指针去访问,指针也能存放数组的地址。

二级指针:指向一级指针地址的指针

如何通过被调函数修改主调函数普通变量的值?
①实参必须为该普通变量的地址&…
②形参必须为指针变量*…
③在被调函数中通过*形参名…的方式就可以修改主调函数相关变量的值

示例:

#include< stdio.h>
void swap (int *p, int*q)
//形参的名字是p和q,接收实参数据的是p和q,而不是*p和*q
{
    
    
	int t; //如果要互换*p和*q的值,则t必须是int,不能是int*
	t=*p;  //p是int*,*p是int
	*p=*q;
	*q=t;
	return;
}
int main(void)
{
    
    
	int a=1;
	int b=2;
	swap(&a,&b);
	/*swap (* p, *q)是错误的
	swap(a, b)也是错误的*/
	printf("a=%d, b=%d\n",a,b);
	return 0;
}

运行结果:
a=2,b=1

猜你喜欢

转载自blog.csdn.net/qq_46485161/article/details/115023649