将变量分配给指针 vs 将变量分配给指针

时间:2021-01-11 01:57:03

标签: arrays c pointers

我现在正在学习指针。这是一本书中的示例代码:

#include <stdio.h>

int main()
{
        int i;

        char char_array[5] = {'a', 'b', 'c', 'd', 'e'};
        int int_array[5] = {1, 2, 3, 4, 5};

        char *char_ptr;
        int *int_ptr;

        char_ptr = char_array;
        int_ptr = int_array;

        for(i=0; i < 5; i++) {
                printf("[integer pointer] points to %p, which contains the integer %d\n", int_ptr, *int_ptr + 1);
                int_ptr = int_ptr + 1;
        }

        for(i=0; i <5; i++) {
                printf("[char pointer] points to %p, which contains the char '%c'\n", char_ptr, *char_ptr);
                char_ptr = char_ptr + 1;
        }
}

问。 char *char_ptr = char_array; 会以任何方式更改此代码的运行方式,还是与上面显示的行相同?

问。本书中的其他示例代码也将 &variable 分配给一个指针,据我所知,这意味着将变量的地址存储到该指针,(例如 char_ptr = &char_array;)。该示例只是将变量本身分配给指针,但该程序仍然设法打印指针指向的内存地址。为什么或为什么不在这种情况下使用 char_ptr = &char_array;?还是没有区别?

> kingvon@KingVon:~/Desktop/asm$ gcc pointertypes.c
> kingvon@KingVon:~/Desktop/asm$ ./a.out [integer pointer] points to
> 0x7ffc225227a0, which contains the integer 2 [integer pointer] points
> to 0x7ffc225227a4, which contains the integer 3 [integer pointer]
> points to 0x7ffc225227a8, which contains the integer 4 [integer
> pointer] points to 0x7ffc225227ac, which contains the integer 5
> [integer pointer] points to 0x7ffc225227b0, which contains the integer
> 6 [char pointer] points to 0x7ffc225227c3, which contains the char 'a'
> [char pointer] points to 0x7ffc225227c4, which contains the char 'b'
> [char pointer] points to 0x7ffc225227c5, which contains the char 'c'
> [char pointer] points to 0x7ffc225227c6, which contains the char 'd'
> [char pointer] points to 0x7ffc225227c7, which contains the char 'e'
> kingvon@KingVon:~/Desktop/asm$

编辑 - 错别字

3 个答案:

答案 0 :(得分:3)

A.是的,这与上面显示的线条相同。

A.来自 C11 标准#6.3.2.1p3 [强调添加]

<块引用>

3 除非它是 sizeof 运算符、_Alignof 运算符或一元 & 运算符的操作数,或者是用于初始化数组的字符串文字,类型为“array of type”的表达式' 转换为类型为 'pointer to type'' 的表达式,该表达式指向数组对象的初始元素,并且不是左值。 ....

所以,在这些陈述中

        char_ptr = char_array;
        int_ptr = int_array;

char_array 被转换为 char * 类型的指针,指向 char_array 的初始元素,int_array 被转换为 int * 类型的指针指向 int_array 的初始元素。

答案 1 :(得分:2)

对于第一季度:

<块引用>

问。 char *char_ptr = char_array; 是否会以任何方式更改此代码的运行方式或 这和上面显示的线条是一样的吗?

char char_array[5] = {'a', 'b', 'c', 'd', 'e'};
char *char_ptr; // declaration
char_ptr = char_array; // assignment

答案:两者都是一样的。 在第一个(有问题)char_ptr 声明和初始化在同一行中完成,在第二个中它们分别完成。

对于第二季度:

<块引用>

为什么或为什么不使用 char_ptr = &char_array;在这种情况下?还是没有区别?

Ans: 在上面的代码中显示的 char_array 是一个 5 个字符的数组,当你使用它的名字来分配给一个指针时 它基本上意味着您正在分配其第一个元素的地址,因此表达式

char_ptr = char_array; // 1. decl & init done separately
char *char_ptr = char_array; //2. decl & init done same line
char *char_ptr = &char_array[0]; //3. same as 2
char *char_ptr = &char_array; // 4. this is not the correct way will give you warning about this usage, its needs char (*)[5] ptr;

all 打印数组起始元素的地址。 表达方式

char *char_ptr = &char_array[0];char *char_ptr = &char_array; 不同,但地址相同

答案 2 :(得分:1)

<块引用>

问。将 char *char_ptr = char_array;更改此代码的功能 以任何方式还是与上面显示的线条相同?

*char_ptr = char_array; 与上面显示的行相同。


<块引用>

问。本书中的其他示例代码也将 &variable 分配给一个指针,据我所知,这意味着将变量的地址存储到该指针,(例如 char_ptr = &char_array;)。该示例只是将变量本身分配给指针,但该程序仍然设法打印指针指向的内存地址。为什么或为什么不使用 char_ptr = &char_array;在这种情况下?还是没有区别?

您在这里要做的是将变量(数组)的地址分配给指针。为了获取数组的地址,您只需使用数组名称,因此您不需要& 运算符来获取数组的地址。有关详细信息,请参阅此 link

& 运算符用于在您想使用指针指向变量的情况下。请参阅此 article 以了解有关 *& 运算符

的更多信息
char *p1;
char *p2;
char var;
char arr[5];

p1 = &var
p2 = arr;

编辑:添加另一种初始化指针的方法

char var;
char arr[5];

char *p1 = &var; // char *p1 = var is not correct
char *p2 = arr;
相关问题