当前位置:网站首页>C语言——void指针、NULL指针、指向指针的指针、常量和指针
C语言——void指针、NULL指针、指向指针的指针、常量和指针
2022-08-09 14:44:00 【Lydialyy】
目录
一、void指针
- void指针我们把它称之为通用指针,就是可以指向任意类型的数据。也就是说,任何类型的指针都可以赋值给void指针。
代码举例:
#include <stdio.h>
int main()
{
int num = 1024;
int *pi = #
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 = #
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 = #
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 = #
//不可被修改,不能执行
// *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 = #
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;
}运行结果:

边栏推荐
- C语言程序设计笔记(浙大翁恺版) 第五周:循环控制
- 升级适配AGP 7.0
- ORDER BY clause is invalid in views, inline functions, derived tables, subqueries, and common table expressions unless TOP, OFFSET, or FOR XML is also specified
- 第五讲 测试技术与用例设计
- 新起之秀 DPU,正在掀起数据中心变革!
- Computer Graphics From Scratch - Chapter 5
- A wave of Versailles: assault by the ali interview guide, I've got nine of the Offer
- C语言程序设计笔记(浙大翁恺版) 第十一周:结构类型
- 下班后用微信工作发病是否属于工伤?法院这样判
- Meta released 175 billion chatbots, and billionaire boss Xiao Zha was madly complained by "him"!
猜你喜欢
随机推荐
C语言程序设计笔记(浙大翁恺版) 第八周:数组
C语言程序设计笔记(浙大翁恺版) 第十周:字符串
MySQL锁机制和锁算法
基于FPGA的FIR滤波器的实现(2)—采用kaiserord & fir2 & firpm函数设计
leetcode 剑指 Offer 07. 重建二叉树
MySQl表的增删查改(聚合查询+联合查询)
C语言程序设计笔记(浙大翁恺版) 第一周:程序设计与C语言
大文件上传和下载场景,如何节省成本?
Docker安装MySQL详细步骤
太厉害了!华为大牛终于把MySQL讲的明明白白(基础+优化+架构)
浏览器tab页签上的title图标favicon.icon
【最新】【获取ip】获取本地ip 获取本机ip地址
基于微信云开发的幼儿园招生报名小程序
【LeetCode】1898. 可移除字符的最大数目
架构师学习心得总结
跨境电商独立站?Lighthouse: WooCommerce!
深圳堡垒机厂家有哪些?重点推荐哪家?
C语言程序设计笔记(浙大翁恺版) 第十三周:文件
A wave of Versailles: assault by the ali interview guide, I've got nine of the Offer
正则表达式实战:最新豆瓣top250爬虫超详细教程









