我现在正在学习指针。这是一本书中的示例代码:
#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$
编辑 - 错别字
答案 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;