我想知道这两个陈述之间的区别。
int *X,a;
X=&a;
我知道X会指向一个地址。而不是如果我只使用
int *X;
那么,如果X是指针变量,我可以用它来分配值,而不是使用其他变量吗?
答案 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或任意地址,它只是巧合的有效地址,任何访问该内存的尝试都可能会失败,无论是否默默无效。