C语言——void指针、NULL指针、指向指针的指针、常量和指针

2023-11-03

目录

一、void指针

二、NULL指针

三、指向指针的指针

1.指向指针的指针

2.指针数组和指向指针的指针

四、常量和指针

1.常量

2.指向常量的指针

3.常量指针

4.指向“指向常量的常量指针”的指针


一、void指针

  • void指针我们把它称之为通用指针,就是可以指向任意类型的数据。也就是说,任何类型的指针都可以赋值给void指针。

代码举例:

#include <stdio.h>

int main()
{
	int num = 1024;
	int *pi = &num;
	char *ps = "LoveC";
	void *pv;
	
	pv = pi;
	printf("pi: %p, pv: %p\n", pi, pv);
	
	pv = ps;
	printf("ps: %p, pv: %p\n", ps, pv);
	
	
	return 0;
	
}

运行结果:

二、NULL指针

  • 在C语言中,如果一个指针不指向任何数据,则称之为空指针,用NULL来表示。
    #define NULL ((void *)0)
  • 当不清楚要将指针初始化为什么地址时,请将它初始化NULL;在对指针进行解引用时,先检查该指针是否为NULL。这种策略可以为今后编写大型程序节省大量的调试时间。
  • NULL不是NUL:NULL用于指针和对象,表示控制,指向一个不被使用的地址;而‘\0‘’表示字符串的结尾。

三、指向指针的指针

1.指向指针的指针

 代码举例:

#include <stdio.h>

int main()
{
	int num = 520;
	int *p = &num;
	int **pp = &p;
	
	printf("num: %d\n", num);
	printf("*p: %d\n", *p);
	printf("**pp: %d\n", **pp);
	
	printf("&p: %p,pp: %p\n", &p,pp);
	printf("&num: %p,p: %p, *pp: %p\n", &num, p, *pp);
	
	return 0;
}

运行结果:

2.指针数组和指向指针的指针

  • 至少有两个好处:① 避免重复分配内存;② 只需要进行一处修改
  • 代码的灵活性和安全性都有了显著提高

代码举例:

#include <stdio.h>

int main()
{
	char *cBooks[] = {
		"<C程序设计语言>",
		"<C专家编程>",
		"<C和指针>",
		"<C陷阱与缺陷>",
		"<C Primer Plus>",
		"<带你学C带你飞>"};
	
	char **byFishC;
	char **jiayuLoves[4];
	int i;
	 
	byFishC = &cBooks[5];
	jiayuLoves[0] = &cBooks[0];
	jiayuLoves[1] = &cBooks[1];
	jiayuLoves[2] = &cBooks[2];
	jiayuLoves[3] = &cBooks[3];
	
	printf("FishC出版的图书有: %s\n", *byFishC);
	printf("小甲鱼喜欢的图书有: \n");
	
	for(i = 0;i< 4;i++)
	{
		printf("%s\n", *jiayuLoves[i]);
	}
	
	return 0;
}

运行结果:

四、常量和指针

1.常量

  • 常量应该是这样:520,'a',3.14
  • 或者这样:
#define PRICE 520
#define A'a'
#define PI 3.14
  • 还可以使用const关键字修饰,把变量变成只读,不可写入不可修改:
const int price = 520;
const char a = 'a';
const float pi = 3.14;

2.指向常量的指针

  • 指针可以修改为指向不同的常量
  • 指针可以修改为指向不同的变量
  • 可以通过解引用来读取指针指向的数据
  • 不可以通过解引用修改指针指向的数据

代码举例:

#include <stdio.h>

int main()
{
	int num = 520;
	const int cnum = 880;
	const int *pc = &cnum;
	
	printf("cnum:%d,&cnum:%p\n",cnum,&cnum);
	printf("*pc:%d,pc:%p\n",*pc,pc);
	
	pc = &num;
	printf("num:%d,&num:%p\n",num,&num);
	printf("*pc:%d,pc:%p\n",*pc,pc);
	
	num = 1024;
	printf("*pc:%d,pc:%p\n",*pc,pc);
	
	return 0;
}

运行结果:

3.常量指针

(1)指向非常量的常量指针

  • 指针自身不可以被修改
  • 指针指向的值可以被修改

(2)指向常量的常量指针

  • 指针自身不可以被修改
  • 指针指向的值也不可以被修改

代码举例:

#include <stdio.h>

int main()
{
	int num = 520;
	const int cnum = 880;
	const int * const p = &num;
	
	//不可被修改,不能执行
//	*p = 1024;
//	printf("*p: %d\n",*p);
	
	//不可被修改,不能执行 
//	p = &cnum;
//	printf("*p: %d\n",*p);
	
	num = 1024;
	printf("*p: %d\n",*p);
	
	return 0;
}

运行结果:

4.指向“指向常量的常量指针”的指针

代码举例:

#include <stdio.h>

int main()
{
	int num = 520;
	const int cnum = 880;
	const int * const p = &num;
	const int * const *pp = &p;
	
	printf("pp: %p,&p: %p\n",pp,&p);
	printf("*pp: %p, p: %p, &num: %p\n",*pp,p,&num);
	printf("**pp: %d, *p: %d, num: %d\n",**pp,*p, num);

	return 0;
}

运行结果:

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C语言——void指针、NULL指针、指向指针的指针、常量和指针 的相关文章

随机推荐

  • Python卸载

    Python卸载 因学习深度学习知识 需要安装Anaconda 而Anaconda本身会自带一个版本的python 为了不产生python版本之间的冲突 想要卸载原先安装的python 卸载python主要有以下几个步骤 1 找到安装pyt
  • java解析zip文件

    java解析zip文件 1 工具类 package org springblade iot utils import org apache commons fileupload FileItem import org apache comm
  • 数组 只出现一次的数字

    题目 只出现一次的数字 说明 给定一个非空整数数组 除了某个元素只出现一次以外 其余每个元素均出现两次 找出那个只出现了一次的元素 Swift 题目 只出现一次的数字 说明 给定一个非空整数数组 除了某个元素只出现一次以外 其余每个元素均出
  • React生命周期执行顺序详解

    文章内容转载于https www cnblogs com faith3 p 9216165 html 一 组件生命周期的执行次数是什么样子的 只执行一次 constructor componentWillMount componentDid
  • qemu: could not load PC BIOS 'bios-256k.bin'

    qemu kvm 创建虚拟机时报错了 qemu could not load PC BIOS bios 256k bin 我在指定了BIOS后仍然不对 使用 find bios 256k bin 我发现 bios 256k bin是一个软连
  • 【shell】-exec和xargs

    目录 实现效果 参数说明 exec参数 xargs参数 exec和xargs 后执行多条语句 exec和xargs 执行自定义函数 如何正确组合 xargs bash c 和环境变量 exec和xargs的区别 exec和xargs的区别
  • C++primer U10 读书笔记 关联容器

    pair 类型 pair
  • 当出现jquery”ScriptResourceMapping时

    在使用MVC框架的时候出现这个问题 jquery ScriptResourceMapping 有以下几个参考步骤 1 添加引用 管理NuGet程序包 在搜索框中搜索jquery 版本有更新 在右侧点击安装jqu 安装后显示script文件
  • unity2D备忘志

    一 角色移动 unity里面的transform组件非常好用 transform right这种枚举值真的很方便 Vector2向量 控制移动方向 Input输入非常非常方便 后面章节有刚体移动 应用也很广泛 transform Trans
  • 质数判断算法

    有人做过这样的验算 1 2 1 41 43 2 2 2 41 47 3 2 3 41 53 于是就可以有这样一个公式 设一正数为n 则n 2 n 41的值一定是一个质数 这个式子一直到n 39时 都是成立的 但n 40时 其式子就不成立了
  • threejs使用tweenjs实现点击标签过渡到相应视角

    效果图 1 点击前 2 点击后 说明 效果就是我在给模型打标签时保存视角和坐标 点击标签的时候读取到坐标数据 再转动到对应视角 1 安装 TWEEN npm install save tweenjs tween js 2 在当前页引入 im
  • springboot整合springcache (redis)

    1 引入依赖
  • 阿里巴巴的18位创始人

    1999年 阿里巴巴集团成立 当时共有18位创始人 大部分是马云的同事 朋友和学生 这篇文章汇总了这18个人的公开资料 马云是阿里巴巴的代言人 然而 事实上 自1999年成立以来 还有17位重要人物共同创立了这家电子商务巨头 但是他们是谁
  • 微信小程序 scroll-view 组件的 bindscroll 不触发不生效

    使用微信小程序基础组件中的scroll view 但是滑动的时候 bindscroll 一直不生效
  • 授人以渔command not found: ***

    配置环境变量是每个开发人员绕不开的初级本领 搜了一下大多数博客都是列出自己系统配置的步骤 授人以鱼不如授人以渔 今天记录一下自己配置验证的方法过程 方便初学者配置 本文围绕 我在macOS配置http server的探究验证过程 1 下载
  • CMD 命令和 ENTRYPOINT 命令的区别

    目录 CMD 命令 CMD shell 形式 1 创建 Dockerfile1 2 构建和运行新镜像 3 覆盖 CMD 4 添加命令选项 CMD exec形式 1 创建Dockerfile2 构建和运行新镜像 2 覆盖 CMD和添加命令选项
  • nginx 常用指令 try_files allow root alias

    nginx 常用指令 try files allow root alias 正则匹配条件 为区分大小写匹配 为不区分大小写匹配 和 分别为区分大小写不匹配及不区分大小写不匹配 文件及目录匹配 其中 f和 f用来判断是否存在文件 d和 d用来
  • Transformer:SegFormer个人总结

    文章目录 前言 一 创新点 二 算法原理 2 1 总体框架 2 2 分层的Transformer结构 2 2 1 Hierarchical Feature Representation 2 2 2 Overlapped Patch Merg
  • CVE-2013-2028 经典栈溢出漏洞复现资料整理

    一个经典的由整数溢出导致栈溢出的漏洞 下面感觉写的有点乱 复现漏洞 CVE 2013 2028 nginx 栈溢出漏洞 相关基础知识 栈的基础知识 https ctf wiki github io ctf wiki pwn linux st
  • C语言——void指针、NULL指针、指向指针的指针、常量和指针

    目录 一 void指针 二 NULL指针 三 指向指针的指针 1 指向指针的指针 2 指针数组和指向指针的指针 四 常量和指针 1 常量 2 指向常量的指针 3 常量指针 4 指向 指向常量的常量指针 的指针 一 void指针 void指针