#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. cf1131D

    题意:总共有n+m个点,每一个点都有一个val,给出一个n*m的矩阵,矩阵中第i行第j列的为=,表示 i 点 和 j+n个点的值相等,<表示i 点比j+n个点的值小,> 刚好相反 要求用最 ...

  2. Tutorial: Publishing additional services for printing

    Complexity:IntermediateData Requirement:Use your own data There may be occasions when you need to pu ...

  3. Web_0005:阿里云服务器OSS权限的配置开通

    创建用户 1,创建子用户 2,点击新建用户 3,设置账号类型,可以同时选 设置权限 1,设置对阿里云模块的控制权限,如 oss  ecs 等的访问控制权限 2,点击所需的权限 3,获取账号的Acess ...

  4. 小白的java学习之路 “ 循环结构(一)”

    循环: 重复得做某一件事情 举例: 打印50份试卷 沿操场跑10圈 做100道编程题 循环结构的特点: 循环条件 (50,10,100) 循环操作 (打印试卷,沿操场跑圈,做编程题) while 循环 ...

  5. Json与Ajax(注册实例)

    需要在服务器上进行哈 jquery的ajax方法: // jquery请求 $.ajax({ url: "./server/slider.json", type: "po ...

  6. 移动端display:flex

    移动端display:flex布局时候,子元素有背景颜色时候,背景颜色不能铺满,有缝隙, // less .t-flex { background: blue; display: flex; > ...

  7. 安装jupyter使用notebook

    安装jupyter pip3 install jupyter --default-timeout=1000 -i https://pypi.tuna.tsinghua.edu.cn/simple 使用 ...

  8. Eigen库学习---Map类

    Eigen中定义了一系列的vector和matrix,相比copy数据,更一般的方式是复用数据的内存,将它们转变为Eigen类型.Map类很好地实现了这个功能. Map定义 Map(PointerAr ...

  9. Microsoft.EntityFrameworkCore.Internal.ServiceProviderCache的类型初始值设定项引发异常。 ---> System.IO.FileLoadException: 未能加载文件或程序集

    场景: 安装程序到全新的环境的电脑时中(此时已经安装了能正常安装程序电脑的环境) 完整错误: Application_ThreadException:System.TypeInitialization ...

  10. First Kernel-pwn

    Kernel pwn-极简题目的操作模式 完全参照M4x师傅的指导,用 hacklu的baby kernel迈了第一步 题目附带文件说明 一般题目会给出bzImage,.cpio, .sh文件 sh文 ...