#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. JS中require函数的警告提示

    在JS中常常使用require函数来引入文件或者路径,不过在使用时需要注意一点,它的参数必须是一串完整的字符串常量或者是由字符常量与变量拼接. (一)require函数的参数为一个变量,如下图所示: ...

  2. JSP+Servlet+Ajax实现用户增删改查的例子

    一.数据库设计 用户表User 已有的测试数据 二.Java代码编写 Java EE的架构一般分为以下五层: ①.Domain ②.DAO ③.Service ④.Controller ⑤.View ...

  3. Java连载74-字符串常用方法、正则表达式简介

    一.字符串相关的常用方法简介​ package com.bjpowernode.java_learning; ​ public class D74_1_StringCommonMethod { pub ...

  4. 我用 Python 集齐了五福

    ​ [新智元导读]又到了每年集五福的时间.你的五福集齐了吗?每天在各种群里苦苦求扫福,或者忍受着别人天天求扫福,是不是有点厌倦了.作为技术人员,怎么能忍受得了这种低效的全人工操作呢?今天就为大家推荐用 ...

  5. Centos7 Python2 升级到Python3

    1. 从Python官网到获取Python3的包, 切换到目录/usr/local/src wget https://www.python.org/ftp/python/3.7.2/Python-3. ...

  6. gulp常用插件之gulp-useref使用

    更多gulp常用插件使用请访问:gulp常用插件汇总 gulp-useref这是一款可以将HTML引用的多个CSS和JS合并起来,减小依赖的文件个数,从而减少浏览器发起的请求次数.gulp-usere ...

  7. 按钮控制彩灯实验 CSU - 1770 树状数组 差分变单点修改

    #include<iostream> #include<algorithm> #include<cstring> using namespace std; ; in ...

  8. Python函数装饰器

    装饰器的原则 1)不修改被修饰函数的源代码: 2)不修改被修饰函数的调用方式: 装饰器的知识点 = 高阶函数 + 函数嵌套 + 闭包 1. 只用高阶函数写装饰器--->有瑕疵 import ti ...

  9. Nginx出现403 forbidden

    我装在linux上的nginx版本是1.16 当我在nginx/conf/nginx.conf文件里配置完代理 location /ds { root /home/nginx; index index ...

  10. MySql 中IFNULL、ISNULL、NULLIF用法(数据库判空)

    来源:http://blog.csdn.net/a466350665/article/details/52994761 http://blog.csdn.net/xingyu0806/article/ ...