指针变量的值和值之间有什么区别?正常变量的地址和C中指针的特殊用途是什么?

时间:2017-06-26 15:55:54

标签: c arrays pointers

这可能是一个非常基本的问题,但在它进入我的脑海之后,我用谷歌搜索它,显然主要是搜索SO。不幸的是,他们都没有帮助我很多。实际上,在C中使用指针的想法似乎让我很困惑,或者可能是我不知道确切的目的。

不要与SO问题混淆: What are the differences between a pointer variable and a reference variable in C++?和我一起。

我将提供一些示例来说明我的担忧:

第一点:

定义说的是这样的:

  

指针是包含另一个变量地址的变量。

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

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没有数组变量....但这真的很有效   用指针替代语法。

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

因此,

最后,我可以看到,没有内存管理,没有其他特殊目的使用指针或有其他方法来做这些(可能我对这个问题有一些误解)。另外,我还有另外一个问题,我们是否可以使用&符号获取的地址来执行内存管理任务而不使用指针?

我仍然是初学者,并且对C有一些基本知识(不完全),我缺乏关于指针的任何高级知识。所以,这些问题让我变得更糟。我几乎没有在SO中找到任何描述指针和正常变量的基本差异的帖子。因此,如果任何专家可以提供有关此的一些知识,将非常感谢。

1 个答案:

答案 0 :(得分:5)

以相反的顺序回答问题:

  

C没有数组变量....但这实际上只是使用带有替代语法的指针。

这是不正确的,您需要将该书签丢入垃圾箱。这是一个常见的错误观念,即数组和指针是相同的,但它们不是。在大多数情况下,数组表达式将转换为指针表达式,并且数组下标是通过指针算法完成的,但数组 object 是实际数组,而不是指针。

  

如果指针也保留变量的地址,同时我们可以使用&获取变量的地址。通过导出任何变量的地址,我们不能做同样的任务指针吗?我的意思是如果我不将它声明为指针并将其用作int ptr =& i;在第二个代码片段并将其用作普通变量,会有什么不同?

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

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

  1. 写入函数的参数;
  2. 跟踪动态分配的内存;
  3. 指针还使树和列表等动态数据结构易于实现,但它们不是必需(除非您在这些结构中使用动态内存分配)。

    写入函数的参数

    C按值传递所有函数参数 ;函数定义中的形式参数是函数调用中实际参数的内存中的单独对象,因此对形参数的任何更改都不会反映在实际参数中。例如,假设以下swap函数:

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

    此功能可以交换ab中的值。但是,当我们将该函数称为

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

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

    swap( &x, &y );
    

    并按如下方式更新函数定义:

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

    我们不是交换ab的内容,而是交换ab 指向的对象的内容。这会一直显示 - 考虑scanf函数,以及如何在标量参数上使用&运算符。

    跟踪动态分配的内存

    动态内存分配函数malloccallocrealloc都返回指向动态内存缓冲区的指针;没有变量与该内存相关联。

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

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