指针和指针变量

时间:2014-09-25 13:26:05

标签: c

我想知道这两个陈述之间的区别。

int *X,a;
X=&a;

我知道X会指向一个地址。而不是如果我只使用

int *X;

那么,如果X是指针变量,我可以用它来分配值,而不是使用其他变量吗?

6 个答案:

答案 0 :(得分:1)

当您声明一个普通变量(例如int a;)时,您可以分配可以存储的内存。但是当你声明一个指针int* x;时,你可以分配一个存储地址的内存。

因此,当您键入int* x = &a;时,会将a的地址存储在指针x中。之后,您可以通过编写*x = something;来更改a的内容,因为您可以访问该指针所指向的地址的内容。

如果你只是声明一个指针int* x;并且没有将它设置为指向任何地方,它将包含一个垃圾地址,它不指向有效的内存。因此,如果您使用它*x = something;而不将其设置为首先指向有效地址,程序将尝试写入随机垃圾地址,这是一个错误 - 程序可能会崩溃。

指针与纯变量没有任何不同。如果您编写类似int a; printf("%d",a);的代码,程序将打印垃圾并可能崩溃,因为您没有将变量初始化为有效的值。

答案 1 :(得分:1)

指针的值是对象的地址。如果您有指向int(int*)的指针,则其值是int对象的地址。 int对象的值是整数。

未初始化的int *变量(用int *x;声明)有一个"垃圾" (未定义)值,因此它指向一个未知的"某些东西"。运行此代码:

int* x;
*x = 5;

可能会导致段错误,因为您尝试将int值写入无效的地址。这样做是一种未定义的行为。

要使指针指向有效的内存,您需要将其设置为初始化内存(如第一个代码段中所示)或使用malloc(或等效内容)分配内存;

int *x = malloc(sizeof(int));
*x = 5;

现在x指向一个可以保存int值的有效RAM。

答案 2 :(得分:0)

定义指针时,在堆栈上分配内存以存储实际数据的地址(在本例中为int)。在为指针分配地址之前,它没有引用的实际int,因此解除引用会产生未定义的行为。如果您不想为其分配不同变量的地址,则必须为堆上的int创建内存:

int *X;
X = malloc( sizeof *X );

当你完成后,一定要释放内存:

free( x );

答案 3 :(得分:0)

是的,你可以这样做:

#include <stdio.h>
#include <stdlib.h>


int main( int argc, const char* argv[] ){

    int N =2;

    int *X = malloc ( N * sizeof * X );

    for ( int i = 0; i < N; i++ )
        X[ i ] = i;

    for ( int i = 0; i < N; i++ )
        printf("\nX[%d] = %d\n", X[ i ] );

    free ( X );

return 0;


}

您可以在第一个循环中看到,您正在为X分配值。 但是为了做到这一点,你首先要使用适当大小的X来实现。

答案 4 :(得分:0)

每次定义指针时,都可以使用它来存储指向内存位置的指针。 如果要将值存储在指针指向的特定内存位置,则需要分配一个内存区域来存储该值,在您的示例中,您可以使用X来存储值,例如:

int *X;

X=(int*)calloc(1,sizeof(int));

// Storing a value into the memory location pointed by X
*X=10;

// ... stuff...
// When you're done using X:
free(X);

答案 5 :(得分:0)

指针用于保存对象的地址。有时像a这样的变量用于访问这样的对象,有时候不会(例如,如果你有一个数组元素或在免费商店上分配)。

一旦指针指向一个对象 - 总是在将一个地址指定给指针之后 - 你可以通过指针改变该对象的内容。

如果你从未为指针赋值(或者对它进行了初始化,它在技术上与指定略有不同),指针将包含无效地址null或任意地址,它只是巧合的有效地址,任何访问该内存的尝试都可能会失败,无论是否默默无效。