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

C语言指针详解(一)

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

C语言指针详解(一)

1、什么是指针?
计算机中所有的数据都必须放在内存中,不同类型的数据占用不同的字节,char:1字节,int:4字节,为了可以正确的访问这些数据,必须为每个字节编上号码,每个字节的编号都是唯一的,我们将内存中字节的编号称为地址或指针。
对于32位操作系统,程序能够使用的内存为4GB(2^32),最小地址为0x0000 0000,最大地址为:0xFFFF FFFF

2、指针变量的定义
int *p = &value;
*表示这是一个指针变量,int,表示是这个指针变量所指向的类型(整型)。
指针是内存的地址,指针变量就是保存了地址变量。

int main()
{
	int a = 10,b = 20;
	int *ip = NULL;
	ip = &a;;
	*ip = 100;
	ip = &b;
	*ip = 200;
	return 0;
}



指针的大小:在32位:4字节 64:8字节

int main()
{
	int *ip = NULL;
	int a = 10;
	ip = &a;
	*ip = 100;
	return 0;
}

ip 存放的是a的首地址(低地址)。
小端存储 (高字节存储在高地址,低字节存储在低地址)

3、指针的应用
(1)值传递和指针传递
值传递:形参的改变并不会改变实参
指针传递:实参的地址给形参指针,通过指针间接改变实参的值。

void Swap(int *ap,int *bp)
{
	int c = *ap;
	*ap = *bp;
	*bp = c;
}
int main()
{
	int x = 10,y = 20;
	Swap(&x,&y);
	return 0;
}

实参压栈,实参-》形参从右向左

void fun(int *p)
{
	int a = 200;
	*p = 100;
	p = &a;

}
int main()
{
	int x = 0;
	int *s = &x;
	fun(s);
	printf("%d %dn",x,s);?//100,100
	return 0;
}

野指针 空指针
不能使用野指针
如何避免野指针,int *p = NULL;当程序运行时,当指针解引用的时候就会提示指向了空地址,防止野指针出现,造成严重后果。因此当定义指针的时候一定要进行判空。
定义指针变量要初始化

int main()
{
	int a;//随机值
	int *ip;//野指针
	a = 10;
	a = *ip;
	*ip = 100;
	return 0;
}


空悬指针(失效指针)

int *fun()
{
	int a = 100;
	int *p = &a;
	return p;
}
int main()
{
	int *ip = NULL;
	ip = fun();
	if(ip != NULL)
	{
		printf("ip %p => %dn",ip,*ip);
	}
	return 0
}

void PrintAr()
{
	int x = 20;
	int ar[10];
}

int *fun()
{
	int a = 100;
	int *p = &a;
	return p;
}
int main()
{
	int *ip = NULL;
	ip = fun();
	PrintAr();
	if(ip != NULL)
	{
		printf("ip %p =>*ip %dn",ip,*ip);
	}
	return 0;
}



如代码演示:当fun()函数调用结束,栈帧被释放,当解引用的时候,还有残留的数据,当在代码中加了PrintAr()之后,fun()函数栈帧释放,新的函数会重新开辟栈帧,解引用就会出现错误。因此:不要把一个局部变量的地址返回,他已经失效。

:当我们变量的生存期不受此函数影响时,我们就可以通过函数返回此变量的地址 静态局部变量,全局变量在.data区,不在栈区

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

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

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