gpt4 book ai didi

c - 指针变量的值和普通变量的地址有什么区别,C 中指针的特殊用途是什么?

转载 作者:太空宇宙 更新时间:2023-11-04 05:49:56 25 4
gpt4 key购买 nike

这可能是一个非常基本的问题,但在 C 中使用指针的想法似乎让我感到困惑,或者我可能不知道确切的目的。我将提供一些示例来说明我的担忧:

第一点:

定义是这样的:

A pointer is a variable containing the address of another variable.

所以,如果一个程序是这样的:

int i = 23;
printf("%d", i);
printf("%d", &i);

另外一个程序是这样的:

int i = 23;
int *ptr;
ptr = &i;
printf("%d", *ptr);
printf("%d", ptr);

上面的两个程序都可以输出相同的东西。

如果指针也将变量的地址保存在其中,同时我们可以使用 & 符号获取变量的地址,我们是否可以通过导出任何地址来完成与指针相同的任务多变的?我的意思是,如果我不将其声明为指针并在第二个代码片段中将其用作 int ptr = &i; 并将其用作普通变量,会有什么区别?

第二点:

我在某个地方找到了 here那:

C does not have array variables....but this is really just working with pointers with an alternative syntax.

这个说法对吗?由于我还是初学者,因此我无法验证有关此的任何陈述。但这让我有些困惑。如果该陈述也是正确的,那么这方面的实际解决方法是什么?它实际上是在后端工作的指针,而只是编译器/ide 通过使用数组来愚弄我们(显然是为了保持简单性)?

最佳答案

倒序回答问题:

C does not have array variables....but this is really just working with pointers with an alternative syntax.

这是不正确的,您需要将该书签扔进垃圾桶。一个常见的误解是数组和指针是一回事,但实际上它们不是。数组表达式在大多数情况下会被转换为指针表达式,数组下标是通过指针运算来完成的,但是数组对象是一个真正的数组,而不是指针。

If pointer also keeps the variable's address in it and at the same time we can get the variable's address using & sign, can't we do the same task pointer does by deriving the address of any variable? I mean if I don't declare it as pointer and use it as int ptr = &i; in 2nd code snippet and use it as normal variable, what would be the differences?

该代码没有说明为什么指针存在,或者它们为什么有用。

C 实际上要求我们在以下情况下使用指针:

  1. 写入函数的参数;
  2. 跟踪动态分配的内存;

指针还使动态数据结构(如树和列表)易于实现,但它们不是必需的(除非您在这些结构中使用动态内存分配)。

写入函数的参数

C 按值传递所有函数参数;函数定义中的形参在内存中是一个独立于函数调用中的实参的对象,因此对形参的任何更改都不会反射(reflect)在实参中。例如,假设以下 swap功能:

void swap( int a, int b ) { int t = a; a = b; b = t; }

此函数交换 a 中的值和 b .但是,当我们将函数调用为

int x = 4, y = 5;
swap( x, y );

x 的值和 y不会更新,因为它们是不同的对象而不是ab .如果我们想更新xy ,我们必须将指针传递给它们:

swap( &x, &y );

并更新函数定义如下:

void swap( int *a, int *b ) { int t = *a; *a = *b; *b = t; }

而不是交换 a 的内容和 b , 我们交换 a 对象的内容和 b 指向。这一直 - 想想scanf函数,以及如何使用 &标量参数的运算符。

跟踪动态分配的内存

动态内存分配函数malloc , calloc , 和 realloc所有返回指向动态内存缓冲区的指针;没有变量 与该内存相关联。

char *buffer = malloc( sizeof *buffer * some_length );

指针是跟踪该内存的唯一方法。

关于c - 指针变量的值和普通变量的地址有什么区别,C 中指针的特殊用途是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44763740/

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