第26课 指针的本质分析
2020/2/28 16:15:27
本文主要是介绍第26课 指针的本质分析,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
*号的意义
·在指针声明时,*号表示所声明的变量为指针
·在指针使用时,*号表示取指针所指向的内存空间中的值
例子:
#include"stdio.h"
int main()
{
int i = 5; int *p =&i; printf("%d,%p\n",i,p); *p = 10; printf("%d,%p\n",i,p); return 0;
};
输出结果:
5,00EFFEA40
10,00EFFEA4
指针也是变量,变量就有地址,指针也可以取地址
变量P保存着变量i的内存地址,即:
p→&i
*p→i
例子26-1:
include"stdio.h"
int main()
{
int i = 0; int* pI; char* pC; float* pF; pI = &i; *pI = 10; printf("%p,%p,%d\n",pI,&i,i); printf("%p,%p,%d\n",sizeof(int*),sizeof(pI),&pI); printf("%p,%p,%d\n",sizeof(char*),sizeof(pC),&pC); printf("%p,%p,%d\n",sizeof(float*),sizeof(pF),&pF); return 0;
};
输出结果:
0056F808,0056F808,10
00000004,00000004,5699580
00000004,00000004,5699568
00000004,00000004,5699556
指针变量只需要4个字节的变量存取,而且int char float 类型的指针变量都是4个字节
传值调用与传址调用
·指针是变量,因此可以声明指针参数
·当一个函数体内部需要改变实参的值,则需要使用指针参数
·函数调用时实参值将复制到形参
·指针适用于复杂数据类型作为参数的函数中
例子26-2:
include"stdio.h"
int swap(int a,int b)
{
int c = a; a = b; b = c;
}
int main()
{
int aa = 1; int bb = 2; printf("aa = %d,bb = %d\n",aa,bb); swap(aa,bb); printf("aa = %d,bb = %d\n",aa,bb); return 0;
}
输出结果:
aa = 1,bb = 2
aa = 1,bb = 2
函数分析:输出结果没有变化是因为swap(aa,bb);将值给了a,b,并没有参与运算,只是简单的传值调用。
改26-2:
include"stdio.h"
int swap(int a,int b)
{
int c = *a; *a = *b; *b = c;
}
int main()
{
int aa = 1; int bb = 2; printf("aa = %d,bb = %d\n",aa,bb); swap(&aa,&bb); printf("aa = %d,bb = %d\n",aa,bb); return 0;
}
输出结果:
aa = 1,bb = 2
aa = 2,bb = 1
函数分析:
传址调用,传的是地址,就能改变aa,bb的地址。
常量与指针
·const int* p; //p可变,p指向的内容不可变
·int const* p; //p可变,p指向的内容不可变
·int* const p; //p不可变,p指向的内容可变
·const int* const p //p不可变,p指向的内容不可变
口诀:左数右指
当const出现在*号左边时指针指向的数据为常量
当const出现在*后右边时指针本身为常量
例子26-3:
include"stdio.h"
int main()
{
int i = 0; const int* p1 = &i; int const* p2 = &i; int* const p3 = &i; const int* const p4 = &i; *p1 = 1; //error p1 = NULL; *p2 = 1; //error p2 = NULL; *p3 = 1; p3 = NULL; //error *p4 = 1; //error p4 = NULL; //error
}
小结:
·指针是C语言中一种特别的变量
·指针所保存的值是内存的地址
·可以通过指针修改内存中的任意地址内容
这篇关于第26课 指针的本质分析的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2022-03-01沐雪多租宝商城源码从.NetCore3.1升级到.Net6的步骤
- 2024-05-08首个适配Visual Studio平台的国产智能编程助手CodeGeeX正式上线!C#程序员必备效率神器!
- 2024-03-30C#设计模式之十六迭代器模式(Iterator Pattern)【行为型】
- 2024-03-29c# datetime tryparse
- 2024-02-21list find index c#
- 2024-01-24convert toint32 c#
- 2024-01-24Advanced .Net Debugging 1:你必须知道的调试工具
- 2024-01-24.NET集成IdGenerator生成分布式全局唯一ID
- 2024-01-23用CI/CD工具Vela部署Elasticsearch + C# 如何使用
- 2024-01-23.NET开源的简单、快速、强大的前后端分离后台权限管理系统