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

为什么指针指向printf输出而不对指针进行任何更改?

指针指向printf输出而不对指针进行任何更改的原因是因为printf函数的作用是将指定的格式化数据输出到标准输出设备(通常是终端),而不会对指针本身进行修改。

指针是一种变量,它存储了一个内存地址,可以用来访问该地址上存储的数据。当我们将一个指针传递给printf函数时,printf函数会根据指针所指向的地址,读取该地址上存储的数据,并按照指定的格式进行输出。

在这个过程中,printf函数并不会对指针本身进行修改。指针的值仍然是传递给printf函数之前的值,指向的地址也不会发生变化。

需要注意的是,如果在printf函数中使用了指针的解引用操作(即*指针),那么printf函数会读取指针所指向地址上存储的数据,并将其作为输出。但这并不会改变指针本身的值或指向的地址。

总结起来,指针指向printf输出而不对指针进行任何更改是因为printf函数的作用是输出数据,而不是修改指针本身。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

指针

0; printf("%x", a); return 0; } 此处的&a应该是int*类型的,但强转成char*类型的指针之后,对p进行解引用赋值成0只能改变一个字节,所以输出的结果是11223300...看计算机输出的结果 指针的大小由电脑的平台所决定的不是由指针类型决定的。 如果平台上是32位的,那就是4个字节的大小;64位的平台就是8个字节的大小。...指针没有初始化 比如这样: c int* i; 这样写是不对的,指针i指向的空间不知道 可以这样写: int* i=NULL; 2....("%d\n", p2 - p1); return 0; } 输出的结果是4哦 指针做比较 指针也是有大小的,就比如有高地址与低地址这么一说 c语言标准规定 允许指针指针指向数组的最后一个元素后面的那个地址进行比较...但是p1,p2可不能储存"abcef"这样的常量字符串,它们只是储存了首字符的地址,所以p1和p2相等.并且p1,p2所指向内存的数据不能更改,因为初始化的常量字符串是不能更改的,可以这样写 c const

29660
  • golang学习笔记9:函数参数与返回值

    函数接收参数副本之后,在使用变量的过程中可能对副本的值进行更改,但不会影响到原来的变量,比如 Function(arg1)。...如果你希望函数可以直接修改参数的值,不是对参数的副本进行操作,你需要将参数的地址(变量名前面添加&符号,比如 &variable)传递给函数,这就是按引用传递,比如 Function(&arg1),此时传递给函数的是一个指针...如果传递给函数的是一个指针指针的值(一个地址)会被复制,但指针的值所指向的地址上的值不会被复制;我们可以通过这个指针的值来修改这个值所指向的地址上的值。...(译者注:指针也是变量类型,有自己的地址和值,通常指针的值指向一个变量的地址。所以,按引用传递也是按值传递。) 几乎在任何情况下,传递指针(一个32位或者64位的值)的消耗都比传递副本来得少。...因为 return 语句同样可以包含一些操作,不是单纯地返回某个值)。

    1.1K20

    【数据结构】深入浅出理解链表中二级指针的应用

    } 测试运行结果和上面没有任何差别: 更改结构体成员 如下代码,我们在主函数中创建了一个结构体变量stu,并给其赋值"张三",20,1006....综上可得: 链表中传入二级指针的原因是我们会遇到需要更改指针plist的指向的情况....如果我们仅是在不改变头指针plist的指向的情况下对链表进行操作(如非空链表的尾删,尾插,对非首结点(FirstNode)的结点的插入/删除操作等),则不需要用到二级指针....plist的指向就固定了.即: 带头结点空链表示意图: 这时我们想改变链表的首结点(firstNode),如头删,头插等操作就只需要改变头结点的指针域即可.plist只需要固定存储头结点(headNode...,因此使用带头结点的链表就可以不使用二级指针操作链表. 2.在外部更改指针指向 原理:既然我们在函数内部给plist赋值不会影响到函数外的plist的指向,那么我们直接将更改指向这步操作放在函数外即可

    20210

    借问变量何处存,牧童笑称用指针,Go lang1.18入门精炼教程,由白丁入鸿儒,go lang类型指针(Pointer)的使用EP05

    指针是指什么?指针是存储另一个变量的内存地址的变量。变量是一种使用方便的占位符,用于引用计算机内存地址,一个指针变量可以指向任何一个值的内存地址它指向那个值的内存地址。...空指针     Go lang空指针是当一个指针被定义后没有分配到任何变量时,它的值为 nil。 nil 指针也称为空指针。...假设我们想对方法内的数组进行一些修改,并且对调用者可以看到方法内的数组所做的更改。...pptr = 3000 变量 a = 200 指针变量 *ptr = 200 指向指针指针变量 **pptr = 200     可以看到发生了连锁反应,起始指向和最终指向都发生了变化,可谓是牵一发动全身...现实问题是,go lang这种“次时代”的新潮流编程语言,为什么不像Java那样,仅仅实现“引用”,一定非得给出“指针”的实质概念呢?

    45640

    熬夜整理的万字CC++总结(二),值得收藏

    指针 标准定义了NULL指针,它作为一个特殊的指针变量,表示不指向任何东西。...与空指针不同,野指针无法通过简单地判断是否为 NULL避免,只能通过养成良好的编程习惯来尽力减少。对野指针进行操作很容易造成程序错误。 什么情况下会导致野指针?...printf("%x\n", *p1); //为什么*p2没有打印出来正确结果? printf("%x\n", *p2); //为什么p1指针+1加了4字节?...显然它是一个指针,但它所指向的是什么? 变量b是一个“指向整型的指针”,所以任何指向b的类型必须是指向指向整型的指针”的指针,更通俗地说,是一个指针指针。 它合法吗? 是的!...(因为若直接删除,另外对象中的指针就会无效,形成所谓的野指针访问无效指针是危险的; 除非这些指针有引用计数或者其它手段确保被指对象的所有权);深复制在浅复制的基础上,连同指针指向的对象也一起复制,

    1.2K20

    小白程序猿10分钟彻底打败指针

    ,所以在函数内部可以对这个参数指针指向的变量进行操作,效果与传入的指针变量一样。...第5行代码:和++运算都属于一元运算符,它们的优先级相同,但运算方向是从右向左的,因此先执行p++,p++的意思是先操作p变量,然后再将p变量+1,这里操作p变量的意思是先执行p,为什么需要两个才能获取到二维数组的元素值呢...与数组指针比较类似的一个概念就是指针数组,指针数组是一个数组,数组的每个元素是个指针,这个指针可以是一个任何类型的指针,声明如下: T *p[N]; p是个数组,这个数组长度为N,数组中的每个元素包含一个指向类型...(),[]运算符的优先级大于运算符,(),[]优先级相同,(),[]从左向右进行运算 先来看看T (*p)[N] 先执行(p),这个执行后,表示p是一个指针,然后这个指针指向哪里呢?...8、无具体类型指针 声明格式如下: void *表明该指针不能确定指向哪里,因此可以将任何指针赋值给该类型的指针

    28940

    CC++ 学习笔记四(指针、数组)

    void 指针是一种特殊的指针,表示“无类型的指针”,因为其没有指定类型,所有它可以指向任何类型的数据,也就是说任何类型的指针可以直接复制给void指针。...同理因为空指针类型无法得知其指向区域的长度,void *指针便无法进行增减操作。 数组 C语言中,数组与指针是一种非常暧昧的关系,因数组和指针经常可以相互的转换,所以经常会将其两者混淆。...那为什么指针可以访问数组中元素? 这是因为数组标识符表示的是该数组的第一个元素的地址,当指针指向数组标识符时,便可以通过指针访问数组中的各个元素。...指针,编译器为其分配了空间,用于存储地址值。而对于存放在其中的值,只有在程序运行时才能知道。 使用指针和数组的注意点与建议 1. 使用指针前必须初始化,否则会指向错误的内存区域,导致程序异常。...3.在不知内存区域具体类型情况下,避免对void 指针进行算术操作 例如,下例子对p任何的操作都会导致程序出错 void *p; p++; p--; 4.

    2.5K00

    CC++练习题(三)

    空栈:栈指针指向空位,每次存入直接存入然后栈指针移动一格,每次取出则先移动一个才能取出 满栈:栈指针指向栈中最后一格数据,每次存入需要先移动栈指针一格再存入,取出直接取出,然后在移动栈指针...为什么? 其实合法的,在编译之前是预编译,预编译会处理#define之流的东东,在编译时这个define就没了。 第二个:程序输出什么? 程序不会输出任何东西。...按照我刚才分析 显然 A D就错了 D错的原因是 线程执行需要资源 因此必然属于一个进程不能更改 B这个最容易搞错,线程被创建后必须有自己的栈空间不能共享。...运行异常 分析: 1、p为野指针; 2、int* p = NULL;也是错误的,p未指向任何地方,却被赋值10,错误; 3、改为p = &a; 野指针的成因主要有三种: 指针变量没有被初始化...,任何指针变量刚被创建的时候不会自动成为NULL,它的缺省值是随机的,它会乱指一气。

    2.2K40

    C++引用

    const int& y = x;//这里不更改y,但是上面可以更改x } 权限可以缩小,但是不能放大,比如我自己的电脑可以借给你暂时使用,但是你不能卖掉它,因为这不是你的,但是我可以;如果我借给你电脑...就像上面的const int a = 10;如果你用int& ra = a;这种方法引用就不对了,因为你没有这个权限,a是不能更改的,所以你前面要加一个const才能进行引用。...int x = 10;就不同了,可以随意更改x,const int& y = x;是不可以更改y,虽然y是x的别名,但是不影响x可以被更改,也就是说y其实也随之被改变了。...int d = 10; double& rd = d;//不同类型的不可以 这里为什么不同类型的不可以呢?...引用在初始化时引用一个实体后,就不能再引用其他实体,指针可以在任何时候指向任何一个同类型实体 没有NULL引用,但有NULL指针

    32400

    go 指针和内存分配详解

    这就是为什么引入变量。 变量是一种占位符,用于引用计算机的内存地址,可理解为内存地址的标签。 什么是指针 指针是存储另一个变量的内存地址的变量。...从处理器的角度来看,需要尽可能减少对内存的访问次数以实现对数据结构进行更加高效的操作。为什么呢?因为尽管处理器包含了缓存,但它在处理数据时还得读取缓存中的数据,读取缓存的次数当然是越少越好!...如上图所示,在采用边界对齐的情况下,当处理器需要访问a_变量和b_变量时都只需进行一次存取(图中花括号表示一次存取操作)。若不采用边界对齐,a_变量只要一次处理器操作,b_变量却至少要进行两次操作。...: a = 100 p = 0xc00004c080 *p = 100 您不仅可以使用*运算符访问指向变量的值,还可以更改它。...: a (before) = 1000 a (after) = 2000 指针指向指针 指针可以指向任何类型的变量。

    97210

    C-指针进阶知识

    )所代表的地址值是一样的,但是类型不一样 为什么要强调这一点?...该部分参考自typedef 命令 - 《阮一峰《C 语言教程》》 - 书栈网 · BookStack void*的用法 void*表示”任意类型的指针“,它可以接收任意类型的指针不必进行强制类型转换...,经常用于作为回调函数中的参数类型,因为这样可以接受任何类型的指针了,包括各种类型的函数指针 当然,void* 不只可以用于回调函数,不知用于承接各种函数指针,void* 可以承接各种类型的指针,用于任何你想用的地方...void*可以直接和其他类型的指针比较存放的地址值是否相同 当要使用void*的时候,必须要进行强制类型转换,否则不知道这个指针究竟是什么类型的 这里要补充的是,承接和使用不同,一个是被赋值,一个是用与进行操作...和nullptr的区别 当void*作为函数的输入和输出时,表示可以接受和输出任意类型的指针 如果函数的参数或返回值可以是任意类型的指针,那么应声明其类型为void* 这里是不是和模版有点类似,模版是泛型编程

    9310

    【C语言】指针

    究竟什么是指针呢?我们先来看一个概念。 回到顶部 直接引用 1. 回想一下,之前我们是如何更改某个变量的值? 我们之前是通过变量名来直接引用变量,然后进行赋值: char a; a = 10; 2....下面的写法是错误的 int *p; *p = 10; //这是错误的 应该在指针变量指向一个确定的变量后再进行赋值。...回到顶部 六、关于指针的疑问 刚学完指针,都可能有一大堆的疑惑,这里我列出几个常见的疑惑吧。 1.一个指针变量占用多少个字节的内存空间?占用的空间是否会跟随所指向变量的类型改变?...在同一种编译器环境下,一个指针变量所占用的内存空间是固定的。比如,在16位编译器环境下,任何一个指针变量都只占用2个字节,并不会随所指向变量的类型改变。 ?...printf("%d", *p); 这个输出结果应该难不倒大家: ?

    3.3K60

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

    printf("%p\n", &a);//000000B633B8FBE4 以16进制的形式输出 //只输出起始(低)位置,后面的地址依次加1; //&取出地址操作符 int* pa =...四、指针类型的意义(为什么不用ptr_t p代表所有指针) 1.指针解引用的时候有多大权限 (如果一个指针代替所有的话,解引用时的字节与变量定义类型不同) 2.指针类型决定了指针向前或向后走一步有多大...return &a; } int main() { int* p = test(); printf("hehe\n");//为什么这里加了一个代码,这里的值就变了 printf("%d\n",...七、空指针指针是一个特殊的数据类型,它的值定义为NULL。空指针不同于NULL的整数表示,它是一个指针变量的特殊值,表示该指针变量不指向任何有效的内存地址。...使用空指针进行解引用操作会导致程序崩溃,因为没有任何有效的内存地址可供访问。在C语言中,空指针主要用于表示指针变量没有指向任何有效的内存地址,例如未初始化的指针变量或已释放的内存块。

    16410

    也说说不知道的Golang中参数传递

    当然不是,请再请看看下面的例子:当我们使用的参数不再是string,改为map类型传入时,输出结果又是什么呢?...(m) fmt.Printf("outer: %v, %p\n",m, m) } 由于在函数test_map2()外仅仅对map变量m进行了声明未初始化,在函数test_map2()中才对map进行了初始化和赋值操纵...没错,细心地读者可能已经发现,内部slice中的第一个元素用来存放数据的结构是个指针类型,一个指向了真正的存放数据的指针!...因此,虽然指针拷贝了,但是指针指向的地址却未更改,而我们在函数内部修改了指针指向的地方的内容,从而实现了对元素修改的目的了。...我们已知原因,数据部分由于是指针类型,这就决定了在函数内部对slice数据的修改是可以生效的,因为值传递进去的是指向数据的指针

    1.8K91

    c语言指针的基本使用

    指针变量的定义和初始化 与C语言其他变量类似,指针也是一种变量,只不过它与其他变量不同,一般变量是直接包含了一个特定的值,指针是包含了一个变量的值所在的地址,也就是说,指针存储了一个变量的地址,间接地指向一个值...0,NULL表示指针指向任何东西(推荐使用NULL,因为使用0时还得进行类型转换)。后文讨论如何将变量的地址赋值给一个指针。 2....这是为什么呢?...如: const int *iPtr; 表示指向的数据为常量,不可更改,但可以改变指针的地址值: int * const iPtr; 表示指针地址为常量,不可更改,但可以改变指针指向的数据的值。...const int * const iPtr; 表示指针地址和指向的数据都为常量,都不可更改

    90610

    Go基础之指针

    Go语言中的指针 一、Go语言中的指针介绍 1.1 指针介绍 指针是一个存储变量内存地址的变量。它们允许程序直接访问和操作内存中的数据,不是对数据的副本进行操作。...*ptr: 读取ptr指针指向地址的值,这个操作称为“解引用”。 *ptr = 100: 将100赋值给ptr指向的变量。 1.3 声明和初始化 在 Go 语言中,可以使用指针来引用任何类型的变量。...string类型的内存,并将指针str指向该内存 fmt.Printf("str: %v\n", str) // 输出 str: 0xc000010120 fmt.Printf...对指针变量进行取值(*)操作,可以获得指针变量指向的原变量的值。 1.6 传递指针给函数 您可以将指针作为参数传递给函数,从而可以在函数内部修改原始变量的值,不是复制。这可以用于实现函数的副作用。...二、空指针指针的零值 指针的零值:如果您声明了一个指针但没有初始化它,它将具有零值,即nil。 空指针:如果指针没有指向任何有效的内存地址,它将具有nil值,表示空指针

    18830

    C语言——指针(1)

    ("%d\n", *(pi + 1));//对pi+1进行解引用 printf("%d\n", pi[1]); printf("%d\n", *(pi + 4));//对pi+4进行解引用 printf...} 我们可以看到输出结果为3,事实上,p2-p1的结果是p2-p1的值(12)(两个地址之差)除以数组元素的长度(4),我们可以理解为指针-指针的绝对值是指针之间的元素个数(序号差),前提是指针变量指向同一个数组中的元素...("字符串长度为:%d\n", ret); return 0; } • 指针的关系运算 指向一个一维数组的指针也可以进行比较,我们知道数组元素的地址是在内存中连续存放的,所以根据这个我们可以进行指针的关系运算...("%d ", *pi); pi++; } return 0; } 这一段代码是想向数组输入元素,然后再进行输出 但是输入后并没有进行输出为什么呢?...如果该表达式为真(返回值⾮零), assert() 不会产⽣ 任何作⽤,程序继续运⾏。

    2010
    领券