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

Rak*_*lam 0 c arrays pointers

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

不要与SO问题混淆: C++中指针变量和引用变量之间有什么区别?和我一起

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

第一点:

定义说的是这样的:

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

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

int i = 23;
printf("%d", i);
printf("%d", &i);
Run Code Online (Sandbox Code Playgroud)

而且,另一个程序是这样的:

int i = 23;
int *ptr;  
ptr = &i;
printf("%d", *ptr);
printf("%d", ptr);
Run Code Online (Sandbox Code Playgroud)

上述两个程序都可以输出相同的内容.

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

第二点:

我在这里找到了:

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

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

所以,

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

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

Joh*_*ode 5

以相反的顺序回答问题:

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

这是不正确的,你需要在垃圾桶里扔掉那个书签.这是一个常见的错误观念,即数组和指针是相同的,但它们不是.在大多数情况下,数组表达式将转换为指针表达式,并且数组下标是通过指针算法完成的,但数组对象是实际数组,而不是指针.

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

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

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

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

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

写入函数的参数

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

void swap( int a, int b ) { int t = a; a = b; b = t; }
Run Code Online (Sandbox Code Playgroud)

此函数在a和中交换值b.但是,当我们将函数称为

int x = 4, y = 5;
swap( x, y );
Run Code Online (Sandbox Code Playgroud)

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

swap( &x, &y );
Run Code Online (Sandbox Code Playgroud)

并更新函数定义,如下所示:

void swap( int *a, int *b ) { int t = *a; *a = *b; *b = t; }
Run Code Online (Sandbox Code Playgroud)

相反,交换的内容ab我们交换的对象的内容ab 指向.这一直在出现 - 考虑scanf函数,以及如何&在标量参数上使用运算符.

跟踪动态分配的内存

动态内存分配函数malloc,calloc以及realloc所有返回动态内存缓冲区的指针; 没有与该记忆相关的变量.

char *buffer = malloc( sizeof *buffer * some_length );
Run Code Online (Sandbox Code Playgroud)

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

  • @RakibulIslam:C几十年来一直教很差,而且有很多被误导的人把那些错误的信息传给了别人.如果您还没有这样做,请将C语言标准的最新[在线草稿](http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf)加入书签.它不是一个很好的*教学*资源(它没有任何类型的教程信息),但它是关于C中各种工作如何工作的权威文档, (2认同)