指针变量';s值&;正常变量的地址和C中指针的特殊用途是什么?

指针变量';s值&;正常变量的地址和C中指针的特殊用途是什么?,c,arrays,pointers,C,Arrays,Pointers,这可能是一个非常基本的问题,但在C中使用指针的想法似乎让我感到困惑,或者我不知道确切的目的。我将提供一些例子来说明我的关注点: 第一点: 定义是这样的: int i = 23; printf("%d", i); printf("%d", &i); int i = 23; int *ptr; ptr = &i; printf("%d", *ptr); printf("%d", ptr); 指针是包含另一个变量地址的变量 所以,如果一个程序是这样的: int i = 23;

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

第一点:

定义是这样的:

int i = 23;
printf("%d", i);
printf("%d", &i);
int i = 23;
int *ptr;  
ptr = &i;
printf("%d", *ptr);
printf("%d", ptr);
指针是包含另一个变量地址的变量

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

int i = 23;
printf("%d", i);
printf("%d", &i);
int i = 23;
int *ptr;  
ptr = &i;
printf("%d", *ptr);
printf("%d", ptr);
另一个程序是这样的:

int i = 23;
printf("%d", i);
printf("%d", &i);
int i = 23;
int *ptr;  
ptr = &i;
printf("%d", *ptr);
printf("%d", ptr);
以上两个程序可以输出相同的内容

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

第二点:

我在某处发现:

C没有数组变量…但这实际上只是工作而已 使用具有替代语法的指针


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

以相反的顺序回答问题:

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

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

如果指针还将变量的地址保存在其中,同时我们可以使用&sign获取变量的地址,那么指针不能通过派生任何变量的地址来完成同样的任务吗?我的意思是,如果我不将其声明为指针并将其用作int ptr=&I;在第二个代码片段中,将其用作普通变量,有什么区别

这段代码并没有说明指针存在的原因,或者它们有用的原因

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

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

    写入函数的参数

    C按值传递所有函数参数;函数定义中的形式参数是内存中与函数调用中的实际参数分开的对象,因此对形式参数的任何更改都不会反映在实际参数中。例如,假设以下
    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
    的值不会更新,因为它们是与
    a
    b
    不同的对象。如果我们想更新
    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。买一本好书。我从K&R开始。尽管它很旧,但它仍然能很好地教授基础知识。这里有一些更多的书籍选项:C有数组,你所指的源代码非常非常糟糕。你所展示的两个程序片段都有未定义的行为,从这个意义上说,它们不是有效的C。这是因为指针和它指向的对象根本不是同一件事——两者甚至没有相同的类型。因此,在每种情况下,
    printf()
    调用中有一个参数的类型与提供的格式字符串所需的类型不匹配。此外,不,使用
    &
    运算符绝对不能避免指针,因为应用该运算符的结果是指针。这样可以减少指针类型变量的使用,但对于避免使用指针却毫无作用。实际上,我所遵循的链接是我陷入这些困惑的原因:(@RakibulIslam:C几十年来一直教得很差,有很多错误信息的人会将错误信息传递给他人。如果你还没有这样做,请将最新的C语言标准加入书签。这不是一个很好的教学资源(它没有任何教程信息),但这是关于C语言中各种事物如何工作的权威性文件,你回答得很好:我认为这是不可能的。投票吧!