gpt4 book ai didi

arrays - **在C语言中是做什么的?

转载 作者:IT王子 更新时间:2023-10-28 23:28:42 25 4
gpt4 key购买 nike

我是 C 新手,具有良好的 java 背景,我正在尝试理解指针和数组。

我知道下标 operator[] 是数组定义的一部分,所以:

int numbers[] = {1,3,4,5};

将创建一个整数数组,在内存中表示为 16 个字节,4 个 4 个字节:

numbers[0] = 1, address 0061FF1C
numbers[1] = 3, address 0061FF20
numbers[2] = 4, address 0061FF24
numbers[3] = 5, address 0061FF28

但是,当涉及到指针时,我的知识开始崩溃,所以如果我要创建指向数组编号的指针,我会执行以下操作:

int *pNumbers = &numbers[0];

看起来像这样:

pointer to numbers

我猜它的大小是 4 个字节?

但是 ** 我读为“指向指针的指针”,这对我来说毫无意义,为什么有人想要指向指针的指针,当然如果 a->b->c 那么a->c 就足够了吗?我知道我遗漏了一些东西,它必须与数组有关,因为 argv 可以是 char[ ]char ** 类型> 如下所示:

int main(int argc, char **argv){}

所以:

  • 这是什么(**)?
  • 它有什么用?
  • 它在内存中是如何表示的?

最佳答案

在 C 中,参数是按值传递的。例如,如果您在 main 中有一个整数变量

int main( void )
{
int x = 10;
//...

还有下面的函数

void f( int x )
{
x = 20;
printf( "x = %d\n", x );
}

那么如果你像这样在main中调用函数

f( x );

然后参数获取main中变量x的值。但是,参数本身在内存中所占的范围与参数不同。所以函数中参数的任何变化都不会影响main中的原始变量,因为这些变化发生在不同的内存范围内。

那么如何改变函数中main中的变量呢?

您需要使用指针传递对变量的引用。

在这种情况下,函数声明如下所示

void f( int *px );

函数定义为

void f( int *px )
{
*px = 20;
printf( "*px = %d\n", *px );
}

在这种情况下,原始变量 x 占用的内存范围发生了变化,因为在函数中我们可以使用指针访问这个范围

    *px = 20;

这个函数当然必须在main中调用

f( &x );

考虑到作为指针px的参数本身是函数的局部变量。也就是函数创建这个变量并用变量x的地址初始化它。

现在让我们假设你在 main 中声明了一个指针,例如以下方式

int main( void )
{
int *px = malloc( sizeof( int ) );
//..

和定义的函数类似

void f( int *px )
{
px = malloc( sizeof( int ) );

printf( "px = %p\n", px );
}

作为参数 px 是一个局部变量,分配给它的任何值都不会影响原始指针。该函数更改的内存范围与main中原始指针px所占用的范围不同。

如何改变函数中原有的指针?只是通过引用传递它!

例如

f( &px );
//...

void f( int **px )
{
*px = malloc( sizeof( int ) );

printf( "*px = %p\n", *px );
}

在这种情况下,存储在原始指针中的值将在函数内发生更改,因为使用解引用的函数访问的内存范围与定义原始指针的内存范围相同。

关于arrays - **在C语言中是做什么的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35021521/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com