这可能是一个非常基本的问题,但在它进入我的脑海之后,我用谷歌搜索它,显然主要是搜索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中找到任何描述指针和正常变量的基本差异的帖子.因此,如果任何专家可以提供有关此的一些知识,将非常感谢.
以相反的顺序回答问题:
C没有数组变量....但这实际上只是使用带有替代语法的指针.
这是不正确的,你需要在垃圾桶里扔掉那个书签.这是一个常见的错误观念,即数组和指针是相同的,但它们不是.在大多数情况下,数组表达式将转换为指针表达式,并且数组下标是通过指针算法完成的,但数组对象是实际数组,而不是指针.
如果指针也保留变量的地址,同时我们可以使用&符号获取变量的地址,那么我们不能通过导出任何变量的地址来执行相同的任务指针吗?我的意思是如果我不将它声明为指针并将其用作int ptr =&i; 在第二个代码片段中并将其用作普通变量,会有什么区别?
该代码没有说明为什么指针存在,或者为什么它们有用.
在以下情况下,C实际上要求我们使用指针:
指针也使树和列表等动态数据结构易于实现,但它们并不是必需的(除非您在这些结构中使用动态内存分配).
写入函数的参数
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)
的价值x和y将不会更新,因为它们是不同的对象比a及b.如果我们要更新x和y,我们必须传递指针给他们:
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)
相反,交换的内容a和b我们交换的对象的内容a和b 指向.这一直在出现 - 考虑scanf函数,以及如何&在标量参数上使用运算符.
跟踪动态分配的内存
动态内存分配函数malloc,calloc以及realloc所有返回动态内存缓冲区的指针; 没有与该记忆相关的变量.
char *buffer = malloc( sizeof *buffer * some_length );
Run Code Online (Sandbox Code Playgroud)
指针是跟踪该内存的唯一方法.