首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

【C 语言】变量本质 ( 变量修改 | 直接修改变量 | 通过内存地址间接修改变量 | 通过指针间接修改变量 )

文章目录 一、变量修改 1、直接修改变量 2、通过内存地址间接修改变量 3、通过指针间接修改变量 一、变量修改 ---- 访问 变量 , 就是 访问 内存空间 ; 访问 指的是 读写 内存 ; 修改变量的方式...: 直接修改 : 通过 变量 , 可以 直接 修改内存 , 间接修改 : 通过取地址符 , 拿到变量所在内存的 地址编号 , 通过地址编号修改内存 ; 1、直接修改变量 #include <stdio.h..., &a=%d\n", a, &a); return 0; } 执行结果 : a=1, &a=6422216 a=2, &a=6422216 3、通过指针间接修改变量 #include <stdio.h...= 2; printf("a=%d, &a=%d\n", a, &a); // 间接修改2 : 通过指针 // 将变量 a 的内存地址赋值给 p int *p;...p = &a; // 通过修改 p 指针指向的内存 , 修改变量 a 的值 *p = 3; printf("a=%d, &a=%d\n", a, &a); return

1.3K10

C语言 | 改变指针变量的值

例35:C语言编程实现改变指针变量的值。 解题思路: 指针p的值是可以变化的,printf函数输出字符串时,从指针变量p当时所指向的元素开始,逐个输出各个字符,直到遇‘\0’为止。...而数组名虽然代表地址,但是它是常量,它的值是不能改变的。...  p=p+7;//指针变量p指向字符串的第8位    printf("%s",p);//输出    return 0;//主函数返回值为0  } 编译运行结果如下: C program language...读者应该特别注意: char *p="I love C program language"; 数组名虽然代表地址,但是它是常量,值不能改变。...p=p+7; 虽然是+7,但是在C语言中,下标是从0开始的。 C语言 | 改变指针变量的值 更多案例可以go公众号:C语言入门到精通

3.5K2419
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    初识指针(指针和指针变量、如何理解地址、指针类型的意义、void*指针、野指针、空指针)(笔记)

    一、指针的概念 指针是一个特殊的变量,它里面存储的数值被解释成为内存里的一个地址。...&a;//pa指针变量 - 存放地址 - 地址又被存放指针 //int* pa,变量的类型,变量的名字 (变量 即 存放的地址) *pa;//*解引用操作符,*pa等价于a //& ---...* //取地址 解引用 return 0; } 二、指针和指针变量 指针:地址 指针变量:变量-存放地址 指针变量用来存放地址的...,指针变量并不完全等同指针, 但口头上 指针 一般是 指针变量 2.1指针变量的大小 1.指针变量是专门用来存放地址的,指针变量的大小取决于一个地址存放需要多大空间 32位机器上:地址线32根,地址的二进制序列就是...使用空指针进行解引用操作会导致程序崩溃,因为没有任何有效的内存地址可供访问。在C语言中,空指针主要用于表示指针变量没有指向任何有效的内存地址,例如未初始化的指针变量或已释放的内存块。

    20110

    C++指针变量作函数参数接收数组地址

    C++指针变量作函数参数接收数组地址 在C++中,用指针变量指向数组元素时要注意: 指针变量p可以指向有效的数组元素,实际上也可以指向数组 以后的内存单元。...在上一节小林已经讲过:数组名代表数组首元素的地址,用数组名作函数的参数,传递的是数组首元素的地址,同样用指针变量作函数形参, 也可以接收从实参传递来的数组首元素的地址。 ...实参与形参的结合,有以下几种形式:  实参 形参 数组名 数组名 数组名 指针变量 指针变量 数组名 指针变量 指针变量 实参数组名array代表一个固定的地址,或者说是指针型常量,它的值是无法改变的;...而形参数组名是指针变量,并不是一个固定的地址值,它的值是可以改变的。...在函数调用开始时,它接收了实参数组首元素的地址,但在函数执行期间,它可以再被赋值。 8.2 C++指针变量作函数参数接收数组地址 更多案例可以go公众号:C语言入门到精通

    9512218

    【C语言篇】深入探究 C 语言指针:揭开指针变量与地址的神秘面纱

    本指南将带您从基础到高级,深入理解指针的概念、使用方法和最佳实践 2. 指针的基础概念 2.1 什么是指针? 指针是 C 语言中特殊的变量,它的值是另一个变量的内存地址。...与普通变量不同,指针并不存储直接的数值,而是指向存储该数值的位置。...解引用(Dereference):通过指针访问其指向的值,使用 * 符号。 绘制变量 var 所在内存单元,其值为 100。 绘制指针 ptr,其值为 var 的地址,箭头指向 var。...2.2 指针的声明与初始化 声明指针时必须指明其指向的变量类型。...通过改变函数指针的值,可以动态调用不同的函数。 5.3 回调函数与指针 回调函数是通过函数指针实现的,用于在函数内部调用用户定义的行为。

    25110

    关于变量、指针、别名(引用)和指针的指针

    今天蛋疼的就写一下这些东西的区别,变量永远是最简单的没有什么技术含量,那么另外一个比较简单的就是别名了,其实个人感觉这个东西完全可以看作是一个人的“小名”,只是对同一个变量多了一个称呼而已,指向的数据和地址是和原变量完全一致的...,并且用&进行取地址操作的得到的地址和原变量的地址是完全一致的(因而在对指针进行赋值的时候如果直接对指针地址操作则需要对变量或者别名使用&进行取地址运算,如果要直接赋值则需要使用*p=进行赋值)。...最复杂的就是指针了,同样个人认为指针到头来就是一个地址,这样可能会比较好理解一些。例如*pointer,那么带有*(解引用操作符)的时候则是表示的数值,如果没有*则表示的是地址。...也就是说可以将pointer看成一个内存地址在这个地址中保存的是另外一个数据的地址,当存在*的时候表示取该地址存取的内容,否则则是取这个变量保存的地址。...//指针赋值 ppi=&ppiA; //指针的指针赋值 cout变量、别名、指针和指针的指针的关系:"<

    1.4K30

    linux-环境变量,进程地址空间

    HOME : 指定用户的主工作目录 ( 即用户登陆到 Linux 系统中时 , 默认的目录 ) SHELL : 当前 Shell, 它的值通常是 /bin/bash 。...指定用户的主工作目录(即用户登陆到Linux系统中时,默认的目录) 1.4环境变量相关的命令 1. echo: 显示某个环境变量值 2. export: 设置一个新的环境变量 3...2.2进程地址空间 通过下面这段代码我们可以发现一个问题,就是在子进程改掉全局变量g_val之后,子进程和父进程的g_val发生了变化,这是正常的,因为进程间具有独立性,但是地址确是一样的,那么同一个地址可能存储两个不一样的值吗...那么当子进程修改了这个变量时,因为进程具有独立性,为了不影响到父进程,在修改之前os会在物理内存中开辟一段新的空间,将原数据拷贝一份到这个新的空间,这个过程就叫写时拷贝,然后子进程的页表映射关系也发生改变...,所以我们能看到g_val这个变量在子进程和父进程的地址是一样的,因为是虚拟内存,但是值却不一样,因为通过页表映射的物理地址不一样。

    9110

    可以改变的量-变量

    1、变量 在程序的运行过程中可以改变的量叫变量,变量是用来存储数值的内存区域。 1.1、作用 变量用来记录数值。使用变量进行代数计算,则该变量中数值可以随着程序的逻辑计算而改变。...1.2、格式 日常变量的使用分为四个部分 变量定义格式:数据类型 变量名 = 变量值; 1.2.1、变量类型(数据类型) 每一个变量均必须指定其变量类型。...1.2.3、“=”号 这里的“=”号是运算符的一种,即=代表赋值运算,并非数学意义上的相等。 1.2.4、变量值 即真正变量存储的数值,实际上是一个常量,需要与变量的数据类型一致。...="+myVar);//10   //改变变量的值 myVar = 20; //打印变量的值 System.out.println("运行程序后:myVar="+myVar);//20...(3)变量使用时有作用域的限制。 /* 变量使用的注意事项: 可以同时定义多个变量 变量定义后可以不赋值,使用时再赋值。不赋值不能使用。

    36530

    【Linux】进程>环境变量&&地址空间&&进程调度

    环境变量通常具有某些特殊用途,还有在系统当中通常具有全局特性 1.2 常见环境变量 PATH : 指定命令的搜索路径 HOME : 指定用户的主工作目录(即用户登陆到Linux系统中时,默认的目录)...,环境表是一个字符指针数组,每个指针指向一个以’\0’结尾的环境字符串 1.6 通过代码如何获取环境变量 1.6.1 命令行第三个参数 #include int main(int argc...能得出如下结论: 变量内容不一样,所以父子进程输出的变量绝对不是同一个变量 但地址值是一样的,说明,该地址绝对不是物理地址!...在Linux地址下,这种地址叫做 虚拟地址 我们在用C/C++语言所看到的地址,全部都是虚拟地址!...3.Linux2.6内核进程调度队列 上图是Linux2.6内核中进程队列的数据结构 3.1 一个CPU拥有一个runqueue 如果有多个CPU就要考虑进程个数的负载均衡问题 3.2 优先级

    6610

    【Linux课程学习】: 进程地址空间,小故事理解虚拟地址,野指针

    一.小实验(不是物理地址,而是虚拟地址/线性地址) Linux大哥,你别骗我,我之前一直给我的时物理地址,没想到你给我一个虚拟的地址,我真的看透你了。...好像结果不是这样的,不是要写时拷贝,是因为(Linux大哥)C语言给了我们一个虚拟的地址。 1.2修改gval的值继续进行实验: 我们每次循环让子进程的gval发生变化,他们的地址还是一样的。...PCB中,有一个mm_struct结果体指针,指向一个mm_struct结构体。 mm_struct是由谁来初始化的?信息来源是可执行程序,因为可执行程序被编译好,就有需要多大的空间等信息。...所以父子进程的有不同的页表,向上返回的虚拟地址是一样的,但是通过不同的页表能映射到不同的物理空间上去。所以就能解释上面小实验了。 在C语言中,变量名就相当于地址。...四.为什么要有虚拟地址+页表 野指针就是有一个虚拟地址,在进行映射的时候,发现找不到真实的物理地址,或者权限不对,就会发生错误。操作系统就可以控制该进程终止。

    10010

    C语言 | 指向结构体变量的指针变量

    例40:C语言实现通过指向结构体变量的指针变量变量输出结构体变量中的信息。...解题思路:在主函数中声明了struct student类型,然后定义了一个struct student类型的变量s_1,又定义了一个指针变量p,它指向一个struct student类型的对象,将结构体变量...s_1的起始地址赋给指针变量p,也就是使p指向s_1,然后对s_1的各个成员赋值。...    struct student *p;//定义结构体指针变量    p=&s_1;//将s_1得地址赋给指针变量    s_1.num=10010;//赋值    strcpy(s_1.name,...思考两个问题,怎么对结构体变量成员赋值?怎么通过指向结构体变量的指针访问结构体变量中成员? C语言 | 通过指向结构体变量的指针变量输出结构体变量中的信息 更多案例可以go公众号:C语言入门到精通

    1.8K2218

    【重拾C语言】七、指针(一)指针与变量、指针操作、指向指针的指针

    例如,int*是指向整数(int)类型的指针。指针变量是一个存储了内存地址值的变量,可以使用指针变量来存储、操作和访问内存中的数据。...= # // 将指针指向num变量的地址 printf("num 的值:%d\n", num); printf("指针所指向的变量的值:%d\n", *ptr);...指针变量用来存储内存地址,可以指向其他变量或数据结构。例如,int *ptr;声明了一个指向整数的指针变量。 间接引用运算符也称为解引用运算符,用于访问指针所指向的变量或数据。...空指针是指未指向任何有效地址的指针。...指向指针的指针存储了一个指向指针变量的地址,通过多级指针可以访问多级间接引用的内存。

    35010

    【C语言笔记】指针变量的运算

    前言 指针变量也是可以进行运算的,如指针变量对其自身加上某个整数或减去某个整数,这在内存上体现为:相对这个指针向后偏移多少个单位或向前偏移了多少个单位,这里的单位与指针变量的类型有关。...【注意】一些处理整数的操作不能用来处理指针。例如,可以把两个整数相乘,但是不能把两个指针相乘。...因为pa为int类型的指针,所以加减运算是以4字节(即sizeof(int))为单位地址向前向后偏移的。看下图: ?...如图:pa1所指向的地址在pa0所指向地址往后8字节处,pa2指向地址在pa1指向地址往前4字节处。 从本示例程序中,还可以看出:连续定义的变量在内存的存储有可能是紧挨着的,有可能是分散着的。...以上就是关于C语言指针变量运算的一些总结:指针变量与整数相加相减是相对该指针指向的地址向后向前偏移多少个单位。这里的单位不能认为总是1。

    1.4K20

    【C++】函数指针 ② ( 数组类型基本语法 | 数组语法 | 数组首元素地址 和 数组地址 | 定义数组类型 | 定义指针数组类型语法 | 直接定义指针数组类型变量语法 )

    的 地址 ; &array 是 整个数组 的地址 ; 数组首元素地址 array , 与 数组地址 &array 是不同的 , array + 1 的 步长是 4 字节 , 也就是 数组元素 的大小..., 这是一个指向数组的指针 // 指向的数组类型是 int[5] 类型 typedef int (*pInt5ArrType)[5]; 使用定义的指针数组类型 , 声明并初始化一个指针数组变量 : int5ArrType...myArray = { 1, 2, 3, 4, 5 }; // 注意 : 将 数组地址 &myArray 赋值给 指针数组类型 // 不要把 数组首元素地址 myArray 赋值给 该变量 , 否则会出错...该定义的类型是 指针类型 , 该指针指向一个 type[size] 数组类型 的 数组 ; p 是 定义的指针数组类型变量名称 ; size 是 数组大小 ; 直接定义指针数组类型变量示例 : 下面定义了变量...p , 该变量是一个指针类型的变量 , 指向 int[5] 类型数组的指针 ; // int(*)[5] 是 指向 int[5] 类型数组的指针 // 这里不使用 typedef 定义的

    12930

    C语言中“指针”和“指针变量”的区别是什么

    比较严格的说法是这样的: 系统为每一个内存单元分配一个地址值,C/C++把这个地址值称为“指针”。如有int i=5;,存放变量i的内存单元的编号(地址)&i被称为指针。...“指针变量”则是存放前述“地址值”的变量,也可以表述为,“指针变量”是存放变量所占内存空间“首地址”的变量(因为一个变量通常要占用连续的多个字节空间)。...比如在int i=5;后有一句int *p=&i;,就把i的指针&i赋给了int *型指针变量p,也就是说p中存入着&i。所以说指针变量是存放指针的变量。...有一个事实值得注意,那就是有不少资料和教科书并没有如上区分,而是认为“指针是指针变量的简称”,如对int *p=&i;的解释是:声明一个int *型指针p,并用变量i的地址初始化;而严格说应该是声明一个...int *型指针变量p才对。

    61730

    【Linux系统编程】—— 深入理解Linux中的环境变量与程序地址空间

    前言:在Linux系统中,环境变量和程序地址空间是系统管理和进程运行的重要组成部分。本文将详细探讨环境变量的作用、如何查看和操作环境变量,并深入了解Linux进程的地址空间及其虚拟内存管理机制。...环境变量 基本概念: 环境变量是操作系统用来指定程序运行环境的参数。它们通常以键值对的形式存储在操作系统中。程序在启动时,系统会将这些环境变量传递给它们。...例如,C/C++编译时,如果某些库的路径已被设置为环境变量,编译器就能自动找到它们,而不需要手动指定路径。 常见的环境变量 PATH:指定命令的搜索路径。操作系统根据此变量查找可执行文件。...环境变量的组织⽅式 每个程序都会收到⼀张环境表,环境表是⼀个字符指针数组,每个指针指向⼀个以’\0’结尾的环境字符串 环境变量的命令 echo:显示环境变量的值。 export:设置环境变量。...环境变量的继承 环境变量通常具有全局属性,可以被⼦进程继承下去,子进程会继承父进程的环境变量。因此,当父进程设置环境变量后,子进程可以访问和修改这些变量。

    11710

    初识C语言——初识指针(什么是内存,什么是指针,指针变量怎么用,指针的大小)

    变量是创建内存中的(在内存中分配空间的),每个内存单元都有地址,所以变量也是有地址的。....指针变量 既然变量的地址可以使用取地址操作符(&)取出,那可不可以把一个变量的地址存储起来呢?...在C语言,有一种专门用来存储地址的变量,叫做指针变量。...指针变量的定义方法: 类型 * 指针变量名;(*说明该变量是一个指针变量) 我们来演示一下: int num = 10; int *p;//p为一个整形指针变量 p = # 这样就把一个整型变量的地址放到了一个整型指针变量里边...为什么不同类型的指针变量大小是一样的呢?又为什么是4个字节呢? 原因是: 指针是用来存放地址的,所以指针变量的大小取决于地址的大小,而在同一平台上地址的大小是固定不变的。

    26510

    Linux编程--指针的++操作

    而不是简单的地址加上对应的数字? 问题2:在for循环中,phdr_start_addr++为何能找到程序头表中的下一个段结构呢?...日志验证 在代码中加入日志,打印phdr的起始与结束地址,以及entry的总数与每个entry的大小。...,+1或者-1都是对于整个结构体而言,所以对于指针的操作,每次加1或者-1都会偏移sizeof(struct)的大小。...*)的指针中进行运算,因为在运行的时候会有很多字节对齐的操作,如果没有指定类型的话,无法知道对应的结构体的大小,所以禁止(void *)指针的计算。...结论 对于地址的加减来说,可以正常按数加减,而且加减完后可以赋值给结构体指针。 而对于指针的加减来说,是对于指针对应的结构体大小而言的,每次加减都是计算的N个结构体大小的偏移。

    84830

    指针变量的传值和传址

    可以使用指针传递或者引用传递。想要在函数体内改变pRes的值,并把这个变化返回到main函数中,必须传递pRes的指针。因为pRes本身就是指针,所以应该传递指针的指针,或者指针的引用。...就是把实参赋值给形参,赋值完毕后实参就和形参没有任何联系,对形参的修改就不会影响到实参。 传地址:把实参地址的拷贝传递给形参。就是把实参的地址复制给形参。...复制完毕后实参的地址和形参的地址没有任何联系,对实参形参地址的修改不会影响到实参, 但是对形参地址所指向对象的修改却直接反应在实参中,因为形参指向的对象就是形参的对象。...无论传值还是传指针,函数都会生成一个临时变量,但传引用时,不会生成临时变量, 传值时,只可以引用值而不可以改变值,但传值引用时,可以改变值, 传指针时,只可以改变指针所指的内容,不可以改变指针本身,但传指针引用时...,既可以改变指针所指的内容,又可以改变指针本身, 引用传递函数的参数,在内存中并没有产生实参的副本,它是直接对实参操作;而使用一般变量传递函数的参数,当发生函数调用时,需要给形参分配存储单元,形参变量是实参变量的副本

    2K30
    领券