空指针和NULL
#include <stdio.h>
int add(int a, int b ){ //函数的返回值和参数意一样有副本机制,存储在寄存器中,而不在内存中,函数的返回值不能取地址 &add()
return a+b;
}
void main1(){
//定义函数指针的三部曲
int add(int a, int b ); //第一步:函数声明
int (*p)(int a, int b ); //第二步:把函数名字改成(*p) ()优先级大于*
//简化 int (*p)(int, int); 定义了一个函数指针变量p,用于指向函数的首地址 返回值为int类型,int (*)(int int) 再加一个p就是指针名字
//对比int *p(int a, int b ); 就不是定义函数指针而是一个函数声明了,即声明了一个返回值类型为指针型的函数。
p =add; //第三步:函数名代表函数的首地址 初始化指针
int res = p(1,3); //第四步:用指针间接调用函数
printf("%d\n",res);
//函数是代码,代码会变化,p++ 无意义
void *pAdd = add; //定义指针变量pAdd时没有指定函数的返回类型和参数列表,不可以用pAdd(1,3)来调用;
//定义函数指针时,函数的参数列表和返回类型缺一不可
} ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void main2(){
//int *p = 0x56777; 直接把地址赋值给指针变量,p指针存储了0x56777的地址,并不知道其按照何种类型来解析,所以不合法
int *pInt = (int *)0x56777; //把0x56777地址强制转换成int * 类型, pInt就知道从0x56777地址开始按照int类型解析数据了 int num =10;
double d =10.4;
int *p1 = #
double *p2 = &d;
void *pVoid = p1;
pVoid = p2; // void 指针主要用于传地址
// printf("%d\n",*pVoid); //void指针只是存储了p2的地址,并没有存储p2的类型,所以无法用*取出他的值
printf("%f\n",*((double *)pVoid)); //void指针只是存储了p2的地址,强制转换成double*类型,(double *)pVoid,就知道按double类型来解析
//空指针用于参数或者返回值,在不明确指针类型的情况下,传递地址
//要把空指针用于某种数据类型,则需要进行强制类型转换 //空指针还是一个指针,可以指向任何一个数据类型的地址,不需要强制类型转换,只有在使用时才要
// NULL是不指向任何地址,主要用于条件判断
int *pInt1 = NULL; //指向为空的指针,指向0000000,不能打印读取
if(pInt1 == NULL){
printf("pInt1没有指向任何地址");
}
} ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#include <memory.h> //使用memset函数
void main3(){
char str[30] = "China is great";
int num[5] ={1,2,3,4,5};
memset(str,'A',5); //void * __cdecl memset(void *_Dst,int _Val,size_t _Size); str的地址传给Dst空指针,从这里开始往后5个字节byte,都赋值于字符‘A’
printf("%s\n",str); //AAAAA is great
memset(num,0,20); // num首的地址传给Dst空指针,从这里开始往后20个字节,都赋值于字符0,整个数组就清零了
for (int i = 0; i < 5; ++i) {
printf("%d,",num[i]); //0,0,0,0,0,
}
}
#include <stdlib.h>
void main(){
//定义一个指针类型包含了三个信息
//1、首地址,2、步长(int float double),3、内容如何解析(%d,%f)
//malloc(1024*1024*100) 分配100M 括号里面是字节数
void *pVoid;
pVoid = malloc(20); //分配20个字节的内存, pVoid保存这段内存空间的首地址
//首地址一样,步长一样,下面按照两种方式解析20个字节的内存数据
//按照%d解析
int *pInt = (int *)pVoid;
for (int i = 0; i < 5; ++i) {
pInt[i] =i;
printf("%d,%f||",pInt[i],pInt[i]); //0,0.000000||1,0.000000||2,0.000000||3,0.000000||4,0.000000||
}
printf("\n\n");
//按照%f解析,
void *pVoidF = malloc(20);
float *pFloat = (float *)pVoidF;
printf("%d\n\n", sizeof(float *));
for (int i = 0; i < 5; ++i) {
pFloat[i]=i; printf("%f,%f,%f||",pFloat[i],pFloat[i],*pFloat); //记得要按照%f解析数据,而不是%d
//0.000000,0.000000,0.000000||1.000000,1.000000,0.000000||2.000000,2.000000,0.000000||3.000000,3.000000,0.000000||4.000000
//,4.000000,0.000000||
} }
空指针和NULL的更多相关文章
- 空指针、NULL指针、零指针
1. 空指针.NULL指针.零指针 1.1 什么是空指针常量 0.0L.'\0'.3 - 3.0 * 17 (它们都是“integer constant expression”)以及 (void*)0 ...
- 空指针/0/NULL
空指针/0/NULL 空指针是一个被赋值为0的指针,在没有被具体初始化之前,其值为0. NULL 是一个标准规定的宏定义,用来表示空指针常量. #define NULL 0 或者 #define ...
- 语法:c++对关于空指针0/NULL/nullptr三者的演变
来源: https://blog.csdn.net/u010558281/article/details/77793644 字面意义上的解释: 0:整型常量 NULL:预处理符号 nullptr:空指 ...
- 为什么通过空指针(NULL)能够正确调用类的部分成员函数
#include <iostream> using namespace std; class B { public: void foo() { cout << "B ...
- OC中的野指针,空指针,nil,Nil,NULL,NSNULL小结
周末与一个老朋友吃饭聊天,因为他正在培训班学习iOS开发,就随便聊了几句,发现自己OC基础上的欠缺和一些知识点的混淆.特此整理如下. 1.空指针 没有存储任何内存地址的指针就称为空指针(NULL指针) ...
- 关于空指针NULL、野指针、通用指针 (转)
reference:https://www.cnblogs.com/losesea/archive/2012/11/16/2772590.html 首先说一下什么是指针,只要明白了指针的含义,你就明白 ...
- 字符数组和string判断是否为空行 NULL和0 namespace变量需要自己进行初始化
string 可以这样判断空行input !="" 字符数组可以通过判断第一个元素是否为空字符'\0',是的话为空行arrar[0]=='\0':或者用长度strlen(char ...
- 野指针、NULL指针和void*
一.野指针 “野指针”不是NULL指针,是指向“垃圾”内存的指针. “野指针”的成因主要有三种: (1)指针变量没有被初始化.任何指针变量刚被创建时不会自动成为NULL指针,它的缺省值是随机的,它会乱 ...
- Null指针
C++ Null 指针 C++ 指针 C++ 指针 在变量声明的时候,如果没有确切的地址可以赋值,为指针变量赋一个 NULL 值是一个良好的编程习惯.赋为 NULL 值的指针被称为空指针. NULL ...
随机推荐
- IDEA安装Flutter遇到的坑
环境: ①IDEA2019.3.3 ②JAVA12 ③Android-SDK29.0.3 ④Flutter1.14.6 ⑤WINDOWS10.0.18363.657 ⑥AL10实体机,Android8 ...
- 限定输入框只能输入数字, TextBox的TextChanged事件调用
/// <summary> /// 限定输入框只能输入数字, TextBox的TextChanged事件调用 /// </summary> /// <param name ...
- mysql修改密码、创建用户、开放远程
创建密码: MariaDB [(none)]> use mysql; MariaDB [mysql]> UPDATE user SET password=password('newpass ...
- vim编辑器未正常关闭时解决方案
目录 vim编辑器未正常关闭时解决方案 问题描述 .swp..swo文件产生原因 解决方案 后记 hosts文件 sudo命令小记 vim编辑器未正常关闭时解决方案 问题描述 在mac上的/etc目录 ...
- codechef Future of draughts
难度 super-hard 题意 官方中文题意 做法 定义1:\(G\)为邻接矩阵,\(I\)为单位矩阵 定义2:\(H\)为转移矩阵,可以不动,即\(H=G+I\) 定义3:\(e_i(x_1,.. ...
- PAT (Basic Level) Practice (中文)1056 组合数的和 (15 分)
给定 N 个非 0 的个位数字,用其中任意 2 个数字都可以组合成 1 个 2 位的数字.要求所有可能组合出来的 2 位数字的和.例如给定 2.5.8,则可以组合出:25.28.52.58.82.85 ...
- java 8 supplier object区别
起初用supplier的时候,发现用法和object一样呀,只是一个用于生产object工厂方法而已,为什么要新引起这样一个对象呢. 后面查到这篇英语文档,才发现,相比object有如下三个用法: ( ...
- 解决linux 终端UnicodeDecodeError: 'utf-8' codec can't decode byte 0xce in position 0: invalid continuation byte
vi /etc/locale.conf 修改LANG="zh_CN.gbk" 最后执行source /etc/locale.conf 即可永久生效,下次登录,中文就不会乱码了.
- BZOJ 3280: 小R的烦恼
Description 小R最近遇上了大麻烦,他的程序设计挂科了.于是他只好找程设老师求情.善良的程设老师答应不挂他,但是要 求小R帮助他一起解决一个难题.问题是这样的,程设老师最近要进行一项邪恶的实 ...
- C# WPF计算器界面(Calculator Design With Animations)
时间如流水,只能流去不流回! 点赞再看,养成习惯,这是您给我创作的动力! 本文 Dotnet9 https://dotnet9.com 已收录,站长乐于分享dotnet相关技术,比如Winform.W ...