指针和函数在C ++中
-
21-09-2019 - |
题
这在大学课程的演讲笔记,在“呼叫按值”:
void fun(int *ip) { *ip =100; }
通过被称为
int n=2; int *np; np = &n; fun(np);
将n的值改变为100。
当我们说“诠释* IP”,究竟是什么,我们是什么意思?整数类型的指针?如果是这样,当我们调用的乐趣()与NP作为它的参数,不应该有一个错误NP具有n的地址,它不是整数?
然后,我们IP的值更改为100,那么难道这不是意味着是n现在有值的,在“内存插槽”与地址100?我相信,我失去了一些东西。 :)
解决方案
整数类型的指针?
没有,指针到的整数。
当我们调用的乐趣()与NP作为它的参数,不应该有一个错误NP具有n的地址,它不是整数?
n
是整数,所以没有问题。 &n
,np
和ip
都在代码相同类型:int*
然后,我们IP的值更改为100
没有......我们不改变*ip
的ip
的价值。也就是说,我们改变值ip
点(也有时也被称为指针对象)。
其他提示
是,当使用int *
作为参数类型fun
的你说它接受一个指向一个int。由于np
是一个指向它传递到fun
一个int是确定。
和np
ip
都指向n
的地址,所以当分配像*ip = 42
的值,它将的42的值分配给所述存储器位置时ip
指向 - 这是n
在具有在示例代码什么被称为按指针强>通过。您的函数有类型的参数的指针整数。所以传递给函数的值是地址可变n
的。功能受让人100
到可变(即,存储位置)的指向由指针参数ip
。星*
是引用操作在C / C ++。
在乐趣(),你并没有改变知识产权的价值为100,你就改变了在存储位置所指向的IP。
用于type*
作为一种类型的装置“的指针,它指向类型”
常见的用途是int *var
,但我喜欢如,使得它从dereferenceing一个指针,即int* var
更好的区别将其写入作为*ptr
。
所以int* a
装置,是一个指针,指向int类型的对象,*a
表示对象指向一个和&a
装置对象的地址。
认为np
的类型int*
的。记住,用于此目的的星号和int
一起做一个“指针INT”型,并且不可分离。
ip
是一个指针,与ip*
你访问“存储器槽”它的指向。 np
也是一个指针。使用&n
分配n
的内存插槽np
的地址。因此调用fun()
时,内部fun()
该真实访问的只读存储器插槽n
的一个,并因此n
100被分配。
一些混淆是可能的,因为在这里n和NP存储号码 - 然而,在编译时,编译器将不同的方式使用的数字;也就是说,当
n++;
和
np++;
均为实际上算术运算,生成的组件是不同的。重要的是要记住的是,最终,所有在计算机中的数据是数字。他们成为不同的类型的数据仅仅是因为我们区别对待。
具体地与问候您例如,
*np = 100;
你需要记住的是,*
手段的解引用的,并且在分配之前该操作发生。它可以是具有多余括号更清楚:
(* (np) ) = 100;
或在不同的上下文:
int n = *np;
现在,我必须说,它温暖我的心脏,当你说,
我们IP的值更改为100,那么难道这不是意味着是n现在有值的,在“内存插槽”与地址100? 因为它掩盖了什么,我认为作为一个重要的认识。不过,我相信我是对的,当我说,你一定要去你的方式做那种事的指针了:
static_cast<int>(np) = 100;
这会做你所描述的,因为它告诉计算机处理是NP为不同类型的号码的数量;在同样的方式,将static_cast<char*>(np)
治疗数NP点为一个字符,而不是作为一个整数。