#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的更多相关文章

  1. 空指针、NULL指针、零指针

    1. 空指针.NULL指针.零指针 1.1 什么是空指针常量 0.0L.'\0'.3 - 3.0 * 17 (它们都是“integer constant expression”)以及 (void*)0 ...

  2. 空指针/0/NULL

    空指针/0/NULL 空指针是一个被赋值为0的指针,在没有被具体初始化之前,其值为0. NULL 是一个标准规定的宏定义,用来表示空指针常量. #define NULL 0   或者 #define ...

  3. 语法:c++对关于空指针0/NULL/nullptr三者的演变

    来源: https://blog.csdn.net/u010558281/article/details/77793644 字面意义上的解释: 0:整型常量 NULL:预处理符号 nullptr:空指 ...

  4. 为什么通过空指针(NULL)能够正确调用类的部分成员函数

    #include <iostream> using namespace std; class B { public: void foo() { cout << "B ...

  5. OC中的野指针,空指针,nil,Nil,NULL,NSNULL小结

    周末与一个老朋友吃饭聊天,因为他正在培训班学习iOS开发,就随便聊了几句,发现自己OC基础上的欠缺和一些知识点的混淆.特此整理如下. 1.空指针 没有存储任何内存地址的指针就称为空指针(NULL指针) ...

  6. 关于空指针NULL、野指针、通用指针 (转)

    reference:https://www.cnblogs.com/losesea/archive/2012/11/16/2772590.html 首先说一下什么是指针,只要明白了指针的含义,你就明白 ...

  7. 字符数组和string判断是否为空行 NULL和0 namespace变量需要自己进行初始化

    string 可以这样判断空行input !="" 字符数组可以通过判断第一个元素是否为空字符'\0',是的话为空行arrar[0]=='\0':或者用长度strlen(char ...

  8. 野指针、NULL指针和void*

    一.野指针 “野指针”不是NULL指针,是指向“垃圾”内存的指针. “野指针”的成因主要有三种: (1)指针变量没有被初始化.任何指针变量刚被创建时不会自动成为NULL指针,它的缺省值是随机的,它会乱 ...

  9. Null指针

    C++ Null 指针 C++ 指针 C++ 指针 在变量声明的时候,如果没有确切的地址可以赋值,为指针变量赋一个 NULL 值是一个良好的编程习惯.赋为 NULL 值的指针被称为空指针. NULL ...

随机推荐

  1. 为什么要进行初始化(C语言)

    答案:是为了清除被释放的内存中保存的以前程序中留下的垃圾数据.

  2. python 字典 day6

    字典 :键与值用:分开   项与项用,分开 特点:key-value结构‘ key为不可变数据类型,key必须唯一 可以任意存放多个value值 ,可以不唯一,可修改 无序 查询速度极快  且不受di ...

  3. 什么人适合学习Django?

    什么人适合学习Django? 我觉得如果你能满足以下2个条件,你就可以果断地选择Django了. 你喜欢Python, 你对Web开发有热情. 学习Python和Django并不难,最重要的是你是否对 ...

  4. nginx模块之ngx_http_fastcgi_module

    nginx支持LNMP 安装php-fpm yum install php-fpm -y 使用/etc/php-fpm.d/www.conf配置文件默认配置即可 打开php配置: vim /etc/n ...

  5. node常用模块汇总

    node常用模块汇总: 点击插件名字,查看使用文档 npm常用模块汇总 node常用模块汇总 gulp常用插件汇总 mkdirp:在node.js中像mkdir -p一样递归创建目录及其子目录

  6. 查看appium参数

    首先打开appium server并运行,然后将手机与电脑相连,然后在python中写代码,但是代码需要出入appium参数,这些参数怎么查询呢? 1.创建appium参数 { "platf ...

  7. 技术之心 | 云信和TA们携手打响防疫战

      1月27日,教育部发布<关于2020年春季学期延期开学的通知>,各地高等院校.中小学.幼儿园纷纷推迟开学.疫情当前,学生们的鼠年寒假变得无比漫长. 网易云信众多教育客户以行动践行教育的 ...

  8. mongo操作图片储存

    python 将图片存入mongodb,读取图片,gridfs模块原创A873054267 最后发布于2018-11-06 15:49:30 阅读数 2785 收藏展开导入图片引入模块,其中gridf ...

  9. [AFO]离开,未尝不是一个新的开始

    2019年5月18日 我注册了洛谷,提交了我的第一份AC代码-- A+B Problem 11月16日-17日 在短短6个月的仓促学习后,我从OI零基础走到了CSP-S的考场上 同年11月26日 在与 ...

  10. C语言实现顺序栈

    C语言实现顺序栈,顺便加深刻++i,++i的区别 #include <stdio.h>#include <stdlib.h>#define maxsize 100/*写在前面的 ...