数据结构之指针回顾

指针

在学c语言的时候对于指针这块儿就一直没弄明白,下面是我看郝斌老师视频的一些总结

1.1 指针和指针变量

  • 指针就是地址,地址就是指针
  • 指针变量是存放地址的变量
  • 指针的本质是一个操作受限的非负整数
  • 指针和指针变量是两个不同的概念
  • 但是要注意: 通常我们叙述时会把指针变量简称为指针,实际它们含义并不一样
  • 地址:
    (1)地址就是内存单元的编号
    (2)从0开始的非负整数
    (3)范围:0–FFFFFFFF【0-4G-1】
# include <stdio.h>
int main(void)
{
	int * p; //p是变量的名字, int * 表示p变量存放的是int类型变量的地址
			 //int * p; 不表示定义了一个名字叫做*p的变量
			// int * p; 应该这样理解: p是变量名, p变量的数据类型是 int *类型
			//          所谓int * 类型 实际就是存放int变量地址的类型	
	int i = 3;
	int j;
	p = &i;
		/*
			1. p保存了i的地址, 因此p指向i
			2. p不是i,i也不是p,更准确的说: 修改p的值不影响i的值,修改i的值也不会影响p的值
			3. 如果一个指针变量指向了某个普通变量, 则
					*指针变量  就完全等同于  普通变量
			   例子:	
					如果p是个指针变量,并且p存放了普通变量i的地址
					则p指向了普通变量i
					*p 	就完全等同于  i
					或者说:  在所有出现*p的地方都可以替换成i
							 在所有出现i的地方都可以替换成*p				
			
			        *p 就是以p的内容为地址的变量
		*/
	j = *p;  //等价于 j = i;
	printf("i = %d, j = %d\n", i, j);
	return 0;
}

1.2 实现两个数交换

# include <stdio.h>

void huhuan_1(int , int);
void huhuan_2(int *, int *);
void huhuan_3(int *, int *);

int main(void)
{
	int a = 3;
	int b = 5;
	
	huhuan_3(&a, &b); //huhuan_2(*p, *q); 是错误的, huhuan_2(a, b);也是错误的
	printf("a = %d, b = %d\n", a, b);

	return 0;
}

//不能完成互换功能
void huhuan_1(int a, int b)
{
	int t;

	t = a;
	a = b;
	b = t;

	return;
}

//不能完成互换功能
void huhuan_2(int * p, int * q)
{
	int * t;//如果要互换p和q的值,则t必须是int *,不能是int,否则会出错

	t = p;
	p = q;
	q = t;
}

//可以完成互换功能
void huhuan_3(int * p, int * q)
{
	int t; //如果要互换*p和*q的值, 则t必须定义成int,不能定义成int *, 否则语法出错

	t = *p;  //p是int *,  *p是int
	*p = *q;
	*q = t;
}

1.3 关于指针常见的错误

# include <stdio.h>
int main(void)
{
	int * p; //p是变量的名字, int * 表示p变量存放的是int类型变量的地址
	int i = 3;

	p = &i;  //OK
	//p = i; //error,因为类型不一致,p只能存放int类型变量的地址,不能存放int类型变量的值
	//p = 55; //error 原因同上

	return 0;
}
# include <stdio.h>
int main(void)
{
	int i = 5;
	int * p;
	int * q;
	p = &i;
	//*q = p; //error 语法编译会出错
	//*q = *p;  //error
	p = q;  //q是垃圾值,q赋给p, p也变成垃圾值
	printf("%d\n", *q);   //13行
		/*
			q的空间是属于本程序的,所以本程序可以读写q的内容, 
			但是如果q内部是垃圾值,则本程序不能读写*q的内容
			因为此时*q所代表的内存单元的控制权限并没有分配给本程序
			所以本程序运行到13行时就会立即出错
		*/
	return 0;
}

2.1 指针和一维数组

数组名
一维数组名是个指针常量
它存放的是一维数组第一个元素的地址
它的值不会被改变
一维数组名指向的是数组的第一个元素
下标和指针的关系:a[i] ---------->> *(a+i)
指针变量的运算
指针变量不能相加,不能相乘,不能相除
如果两指针变量属于同一数组,则可以相减

想要遍历数组,只需要知道数组的首地址和数组的长度
【举例】
如何通过被调函数修改主调函数中一维数组的内容:两个参数

  • 存放数组首元素的指针元素
  • 存放数组元素长度的整形变量
#include <studio.h>
void Show_Array(int * p,int len)
{
    int i = 0;
    for(i=0;i<len;++i)
    printf("%d\n",p[i]);  //p[i]就是主函数的a[i]
   // p[0] = -1;//p[0]==*p  p[2]==*(p+2)==*(a+2)==a[2]
}
int main(void)
{
    int a[5]={1,2,3,4,5};
    Show_Array(a,5);//a等价于&a[0],&a[0]本身就是int *类型
   // printf("%d\n",a[0]);//a[2]==-1
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值