栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C语言学习笔记02——指针

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C语言学习笔记02——指针

目录

指针

1.指针基本概念2.基本指针使用3. 空指针与野指针4. 指针与一维数组5.多级指针6.指针与函数

指针 1.指针基本概念

定义:指针就是地址,地址是内存单元的编号
作用:

能够直接访问硬件使函数返回一个以上的值能够表示复杂的数据结构,快速的传递数据,减少内存的耗用

语法: 数据类型 * 变量名;

注:

可以通过 & 符号 获取变量的地址利用指针可以记录地址对指针变量解引用,可以操作指针指向的内存

2.基本指针使用

示例1:指针定义

#include

int main(void)
{
	int *p;		// 1>	p 是变量的名字, int* 表示p变量存放的是int类型变量的地址
					// 2>	int *p ; p 是变量名, p 变量的数据类型是 int * 类型
					// 3>	int * 类型 就是存放int 变量地址的类型

	int i = 3;
	int j;

	p = &i;
		

	j = *p;
	printf("i = %d, j = %dn", i, j);

	return 0;
}
示例2:指针使用
# include 

int main(void)
{
	int * p;//等价于 int *p; 也等价于 int* p;
	int i = 5;
	char ch = 'A';

	p = &i;  // *p 以p的内容为地址的变量
	*p = 99;
	printf("i = %d, *p = %dn", i, *p);
	
	//p = &ch;
	//p = ch; //error
	//p = 5;  //error

	return 0;
}

示例3:指针经典程序-互换两个数字
# include

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_1(a, b);
	
	printf("a = %d, b = %dn", a, b);

	return 0;

}

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

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

	printf("a1 =%d, b1 =%dn", a, b);

	return;
}


//不能完成互换功能
//形参属于局部变量,只能在本函数中使用
void huhuan_2(int *p, int * q)
{
	int * t;//如果要互换p和q的值,则t必须是int *,不能是int,否则会出错
	
	t = p;
	p = q;
	q = t;

	return;
}

void huhuan_3(int * p, int* q)
{
	int t; // 如果要互换*p和*q的值,则t必须定义成int
	

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

	return;
}



 
3. 空指针与野指针

空指针:指针变量指向内存中编号为0的空间
用途: 初始化指针变量

注意: 空指针指向的内存是不可以访问的

示例:空指针

int main() {

	//指针变量p指向内存地址编号为0的空间
	int * p = NULL;

	//访问空指针报错 
	//内存编号0 ~255为系统占用内存,不允许用户访问
	cout << *p << endl;

	system("pause");

	return 0;
}

野指针:指针变量指向非法的内存空间

示例:野指针

int main() {

	//指针变量p指向内存地址编号为0x1100的空间
	int * p = (int *)0x1100;

	//访问野指针报错 
	cout << *p << endl;

	system("pause");

	return 0;
}
4. 指针与一维数组

**作用:**利用指针访问数组中元素

示例:
# include 

int main(void)
{
	int a[5]; /a是数组名  5是数组元素的个数 元素就是变量  a[0]  -- a[4]
//	int a[3][4]; //3行4列 a[0][0]是第一个元素 a[i][j]第i+1行j+1列
	int b[5];
	
	//a = b;//error a是常量
	printf("%#Xn", &a[0]);
	printf("%#Xn", a);

	return 0;
}
/
	输出结果是:
--------------
0x12FF6C
0x12FF6C
Press any key to continue
--------------
	总结:
		一维数组名
					一维数组名是个指针常量
					它存放的是一维数组第一个元素的地址

/
5.多级指针

示例:

#include

int main(void)
{
int i = 10;
int *p = &i;  /p只能存放int类型变量的地址
int **q = &p;  /q是int**类型,只能存放int*类型变量的地址
int ***r = &q;  /r是int***类型,只能用来存放int**类型变量的地址
printf("i = %dn",***r);  / ***r表示的是i

return 0;

6.指针与函数

**作用:**利用指针作函数参数,可以修改实参的值

示例:
void swap1(int a ,int b)
{
	int temp = a;
	a = b; 
	b = temp;
}
/地址传递
void swap2(int * p1, int *p2)
{
	int temp = *p1;
	*p1 = *p2;
	*p2 = temp;
}

int main() {

	int a = 10;
	int b = 20;
	swap1(a, b); // 值传递不会改变实参

	swap2(&a, &b); //地址传递会改变实参

	cout << "a = " << a << endl;

	cout << "b = " << b << endl;

	system("pause");

	return 0;
}

总结: 如果不想修改实参,就用值传递,如果想修改实参,就用地址传递

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/768355.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号