关于初见指针的那些事

目录

1. 指针用法的简单介绍

2. 指针的重要性    

3. 指针的定义

4. 指针的分类

 4. 1基本结构指针

5. 指针常见问题

6. 经典指针程序 互换两个数


1. 指针用法的简单介绍

       指针也就是内存地址,指针变量是用来存放内存地址的变量。

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;
}

注 int*p 应这样理解 :p是变量名,p变量的数据类型是int*类型 

    所谓int *类型,实际就是存放int变量地址的类型

     int表示的是一个整数,所以i只能存放整数。

     int*表示的是一个整数地址,所以p只能存放整数地址,而整数地址就是整形变量地址

总结

        指针就是地址 地址就是指针

        地址就是内存单元的编号

        指针变量是存放地址的变量 

        指针和指针变量是两个不同的概念

        但是要注意,通常我们叙述时会把指针变量通称为指针,实际上它们含义并不一样

2. 指针的重要性    

         表示一些复杂的数据结构

         快速的传递数据

         使函数返回一个以上的值

         能直接返回硬件

         能方便的处理字符串

         是理解面向对象语言中引用的基础

总之 :指针是C语言的灵魂

3. 指针的定义

    地址

             内存单元的编号

             从零开始的非负整数

             范围:4G{0--4g-1}

     指针

        指针就是地址 地址就是指针

        地址就是内存单元的编号

        指针变量是存放地址的变量 

        指针和指针变量是两个不同的概念

        但是要注意,通常我们叙述时会把指针变量通称为指针,实际上它们含义并不一样

        指针的本质就是一个操作受限的非负整数

4. 指针的分类

       1. 基本类型指针

       2. 指针和数组

       3. 指针和函数

       4. 指针和结构体

 4. 1基本结构指针

#include<stdio.h>

int main(void)
{
	int* p;//p是变量的名字,int * 表示p表示存放的是int类型变量的地址
	int i = 3;
	int j;

	p = &i;
	/*
	 p保存了i的地址,因此p指向i
	 p不是i,i也不是p,更准确的说;修改p的值不影响i的值,修改i的值也不会影响p的值
	 如果一个指针变量指向了某个普通变量,则
		   *指针变量 就完全等同于 普通变量
	 例子:
		 如果p是个指针变量,并且p存放了普通变量i的地址
		 则p指向了普通变量i
		 *p 就完全等同于  i
		 或者说: 在所有出现*p的地方都可以替换成i
				 在所有出现i的地方都可以替换成*p
                 *p 就是以p的内容为地址的变量
	*/
	j = *p; //等价于于 j = i;
	printf("i = %d, j = %d", i, j);

	return 0;
}//i = 3, j = 3

5. 指针常见问题

# 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); 
	/*
	q的空间是是属于本程序,所以本程序可以读写q的内容,
	但是如果q内部是垃圾值,则本程序不能读写* p的内容
	因为此时*q所代表的内存单元的控制权限并没有分配给本程序
	所以本程序运行到13行时就会立即出错
     */
	return 0;

}

6. 经典指针程序 互换两个数

#include<stdio.h>
 //并不能完成互换功能
void huhuan(int a, int b)
{
	int t;

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

	return;
}

int main(void)
{
	int a = 3;
	int b = 5;
	
	huhuan(a, b);
	printf("a = %d, b = %d\n", a, b);
	
	return 0;
}

不行

#include<stdio.h>
//不能完成互换
void huhuan(int *p, int *q)
{
	int * t; //如果要互换p和q的值,则t必须是int *,不能是int,否则会出错

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

}

int main(void)
{
	int a = 3;
	int b = 5;

	huhuan(&a, &b); //huhuan(*p, *q);是错误的 huhuan(a, b); 也错误
	printf("a = %d, b = %d\n", a, b);

	return 0;
}

也不行

#include<stdio.h>
//完成
void huhuan(int* p, int* q)
{
	int t; //如果要互换*p和*q的值,则t必须定义为int,不能定义成int *,否则语法出错

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

}

int main(void)
{
	int a = 3;
	int b = 5;

	huhuan(&a, &b); //huhuan(*p, *q);是错误的 huhuan(a, b); 也错误
	printf("a = %d, b = %d\n", a, b);

	return 0;
}

成功


感谢大家的观看

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值