【C 语言】指针数据类型 ( 不允许向 NULL 地址写入数据 | 不允许不断地改变指针指向 | 字面量存放位置 )

简介: 【C 语言】指针数据类型 ( 不允许向 NULL 地址写入数据 | 不允许不断地改变指针指向 | 字面量存放位置 )

文章目录

一、不允许向 NULL 地址写入数据

二、不允许不断地改变指针指向

三、字面量存放位置





一、不允许向 NULL 地址写入数据


声明指针变量 , 并为其 设置 NULL 初始值 , NULL 就是 0 ;


char *p = NULL;


注意 , 此时一定不能访问 p 指针变量指向的地址 , 0 地址是操作系统保护地址 , 读写该地址的数据 , 都会报错 ;



C/C++ 中的 NULL 的值为 0 ;


#ifndef NULL
#ifdef __cplusplus
#ifndef _WIN64
#define NULL 0
#else
#define NULL 0LL
#endif  /* W64 */
#else
#define NULL ((void *)0)
#endif
#endif


如果在声明指针后 , 向 NULL 地址写出数据 , 执行时直接报错 ;


错误代码示例 :


#include <stdio.h>
#include <stdlib.h>
int main()
{
    // 声明指针变量 , 并为其设置 NULL 初始值
    // NULL 就是 0
    char *p = NULL;
    // 向 0 地址写出数据会报错
    strcpy(p, "123");
    // 打印 p 指针内容
    printf("%s\n", p);
    return 0;
}


执行结果 : 上述代码执行时 , 没有任何响应 ;

image.png







二、不允许不断地改变指针指向


指针变量 声明后 , 不断修改 指针变量的值 , 就是 不断改变 指针变量 指向内存空间的位置 ;


上述操作会导致 多个指针变量 , 会 指向同一块内存空间 , 这种做法不会出错 , 但是 容易出现 BUG , 一旦出问题根本找不到原因 ;



代码示例 :


#include <stdio.h>
#include <stdlib.h>
int main()
{
    // 声明指针变量 , 并为其设置 NULL 初始值
    // NULL 就是 0
    char *p = NULL;
    char *p2 = NULL;
    // 堆内存中申请 20 字节数据
    p2 = (char *)malloc(20);
    // 为内存赋值
    strcpy(p2, "1234567890");
    int i = 0;
    for(i = 0; i < 10; i++)
    {
        // 借用 p 指针遍历 p2 指针指向的内存
        p = p2 + i;
        printf("%c\n", *p);
    }
    return 0;
}


执行结果 :

image.png







三、字面量存放位置


在代码中 , 如果出现 0 , 1 等字面量 , 如


int a = 0;


上述 字面量 0 没有放在栈区 , 字面量 无法取地址 , 没有放在 栈区 和 堆区 ;


目录
相关文章
|
6月前
|
存储 安全 Java
【Golang】(4)Go里面的指针如何?函数与方法怎么不一样?带你了解Go不同于其他高级语言的语法
结构体可以存储一组不同类型的数据,是一种符合类型。Go抛弃了类与继承,同时也抛弃了构造方法,刻意弱化了面向对象的功能,Go并非是一个传统OOP的语言,但是Go依旧有着OOP的影子,通过结构体和方法也可以模拟出一个类。
336 2
|
8月前
|
存储 C++
C++语言中指针变量int和取值操作ptr详细说明。
总结起来,在 C++ 中正确理解和运用 int 类型地址及其相关取值、设定等操纵至关重要且基础性强:定义 int 类型 pointer 需加星号;初始化 pointer 需配合 & 取址;读写 pointer 执向之处需配合 * 解引用操纵进行。
660 12
|
存储 程序员 编译器
C 语言中的数据类型转换:连接不同数据世界的桥梁
C语言中的数据类型转换是程序设计中不可或缺的一部分,它如同连接不同数据世界的桥梁,使得不同类型的变量之间能够互相传递和转换,确保了程序的灵活性与兼容性。通过强制类型转换或自动类型转换,C语言允许开发者在保证数据完整性的前提下,实现复杂的数据处理逻辑。
|
存储 人工智能 程序员
一文彻底搞清楚C语言的数据类型和变量
本文介绍了数据类型(基本、构造、指针、空类型)、变量(使用、命名规则、作用域)和常量(字面、符号、枚举、表达式),帮助初学者理解编程基础概念。坚持学习,定能创造奇迹!
2061 1
一文彻底搞清楚C语言的数据类型和变量
|
C语言
【C语言程序设计——入门】基本数据类型与表达式(头歌实践教学平台习题)【合集】
这份文档详细介绍了编程任务的多个关卡,涵盖C语言的基础知识和应用。主要内容包括: 1. **目录**:列出所有关卡,如`print函数操作`、`转义字符使用`、`数的向上取整`等。 2. **各关卡的任务描述**:明确每关的具体编程任务,例如使用`printf`函数输出特定字符串、实现向上取整功能等。 3. **相关知识**:提供完成任务所需的背景知识,如格式化输出、算术运算符、关系运算符等。 4. **编程要求**:给出具体的代码编写提示。 5. **测试说明**:包含预期输入输出,帮助验证程序正确性。 6. 文档通过逐步引导学习者掌握C语言的基本语法和常用函数,适合初学者练习编程技能。
370 1
|
存储 编译器 数据处理
C 语言结构体与位域:高效数据组织与内存优化
C语言中的结构体与位域是实现高效数据组织和内存优化的重要工具。结构体允许将不同类型的数据组合成一个整体,而位域则进一步允许对结构体成员的位进行精细控制,以节省内存空间。两者结合使用,可在嵌入式系统等资源受限环境中发挥巨大作用。
530 12
|
存储 编译器 C语言
【C语言】数据类型全解析:编程效率提升的秘诀
在C语言中,合理选择和使用数据类型是编程的关键。通过深入理解基本数据类型和派生数据类型,掌握类型限定符和扩展技巧,可以编写出高效、稳定、可维护的代码。无论是在普通应用还是嵌入式系统中,数据类型的合理使用都能显著提升程序的性能和可靠性。
689 8
|
存储 数据管理 C语言
C 语言中的文件操作:数据持久化的关键桥梁
C语言中的文件操作是实现数据持久化的重要手段,通过 fopen、fclose、fread、fwrite 等函数,可以实现对文件的创建、读写和关闭,构建程序与外部数据存储之间的桥梁。
|
存储 数据建模 程序员
C 语言结构体 —— 数据封装的利器
C语言结构体是一种用户自定义的数据类型,用于将不同类型的数据组合在一起,形成一个整体。它支持数据封装,便于管理和传递复杂数据,是程序设计中的重要工具。
|
存储 C语言
【c语言】数据类型和变量
本文介绍了C语言中的数据类型和变量。数据类型分为内置类型和自定义类型,内置类型包括字符型、整型、浮点型等,每种类型有不同的内存大小和取值范围。变量分为全局变量和局部变量,它们在内存中的存储位置也有所不同,分别位于静态区和栈区。通过示例代码和图解,详细阐述了这些概念及其应用。
311 1