两者有什么区别,ptr指向变量,ptr指向内存?我知道指针是一个保存变量内存地址的变量。那么......指向变量的ptr保存该变量的地址,而指向内存的ptr直接指向内存?第一个仍然保留一些关于初始变量的信息,而后者只知道一个地址?
编辑:我对这个问题并不意味着引起如此多的争议,而且我不完全确定为什么它会被投票。我只是想了解指针......在对链接的“重复”进行一些阅读之后。我的理解是,指向变量的ptr始终引用该变量,不能重新分配,也不能指向其他指针,并与变量共享地址。内存指针可以指向NULL,可以重新分配,可以指向其他指针,并拥有自己的内存地址。这些对于C还是仅对C ++来说是正确的答案 0 :(得分:2)
指针是一个变量,其值是内存中的地址。指针也知道它所指向的任何类型(或者它是一个空的*)。
基本上就是它的全部内容。指向变量的"指针之间没有根本的区别。和指向内存的指针#34;无论指针指向的指针在任何情况下都是。无论指针指向char
变量,还是double
变量或对象,它始终只是指向char
/ {{1}的内存位置} / object存储。
答案 1 :(得分:0)
这就是我看待它的方式,我会以身作则。
在C中,指针变量可以声明为:
char* p;
然后你可以通过像这样的char数组为你的程序保留堆栈内存:
char buffer[5000];
然后你可以使指针像这样引用这个内存块:
p=buffer;
默认情况下,变量指向堆栈内存中的自己的地址以便快速访问。如果要从堆中分配指向内存的指针,可以使用calloc()
或malloc()
。例如,此代码:
char* m;
m=malloc(5000);
...从堆中分配5000字节的内存(也称为扩展内存)。然后当你引用那个指针时,你实际上是在读取和写入RAM。
打印字母" A"两次到同一个静态内存位置然后读回来:
char block[10];
char* p=block;
block[0]='A'; //write to 1st position of block memory
*p='A'; //write same value to 1st position of block memory again
char *r;
r=p;
printf("%c",*r);
现在是相同的程序,但这次只使用堆中的内存:
char* block;
block=malloc(10);
char* p=block;
block[0]='A'; //write to 1st position of block memory
*p='A'; //write same value to 1st position of block memory again
char *r;
r=p;
printf("%c",*r);
free(block);
答案 2 :(得分:0)
请注意我仍在学习并且某些信息可能有误
好的例如让make
int i = 5;
int *ptr = &i;
让我们说这些的内存地址是
i = 0x0001
ptr =0x0002
那些内存地址中的是
0x0001 = 0101 // this is 5 for binary
0x0002 = 0x0001 //this is the address of 'i'
所以当以这种方式调用ptr时,你会得到这些值
ptr = 0x0001 // the address stored in ptr
*ptr = 0101 // the * means whatever is at the address stored in ptr
如果我写得像这样
int i = 5;
int *ptr = *i;
那么ptr将拥有' i'
i = 0x0001
ptr = 0101
所以如果我再次以这些方式打电话给ptr
ptr = 0101
*ptr // this will not work cus 0101 is not a memory address
修改强>
同样在你的编辑中你说"指向变量的ptr总是引用该变量,不能重新分配,也不能指向其他指针,并与变量共享地址。"
对于C来说不是这样,指针可以随时重新分配,并且可以指向其他指针
除非它是作为
制作的const int *ptr = &i;
然后指针无法稍后更改
另外你说"内存指针可以指向NULL,可以重新分配,可以指向其他指针,并拥有自己的内存地址"
正如我上面所说的那样,但是没有内存指针和变量指针这样的东西,只有指针可以保存内存地址。