变量指针与内存指针

时间:2015-10-31 21:28:27

标签: c pointers

两者有什么区别,ptr指向变量,ptr指向内存?我知道指针是一个保存变量内存地址的变量。那么......指向变量的ptr保存该变量的地址,而指向内存的ptr直接指向内存?第一个仍然保留一些关于初始变量的信息,而后者只知道一个地址?

编辑:我对这个问题并不意味着引起如此多的争议,而且我不完全确定为什么它会被投票。我只是想了解指针......在对链接的“重复”进行一些阅读之后。我的理解是,指向变量的ptr始终引用该变量,不能重新分配,也不能指向其他指针,并与变量共享地址。内存指针可以指向NULL,可以重新分配,可以指向其他指针,并拥有自己的内存地址。这些对于C还是仅对C ++来说是正确的

3 个答案:

答案 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,可以重新分配,可以指向其他指针,并拥有自己的内存地址"

正如我上面所说的那样,但是没有内存指针和变量指针这样的东西,只有指针可以保存内存地址。