1) 误解:
每当用C语言声明数组时,都会隐式创建指向数组第一个元素的指针(数组的名称).(是吗?我不这么认为!)
这个页面的前两行(虽然我不确定信息的正确性)说明相同.
正如我们所看到的,当我们声明一个数组时,为数组的单元分配了一个连续的内存块,并且还分配了一个指针单元(适当类型)并初始化为指向数组的第一个单元.
但是,当我输出包含的地址在该指针和地址的该指针,就变成是相同的.所以,我认为毕竟不会创建指针.
任何人都可以详细解释编译器何时决定将数组名称转换为指针,为什么?
PS:请解释一下功能.此外,在这个环节中,已经给出,说是一个函数int square(int,int),任意 square,&square,*square,**square是指同一个函数指针.你可以解释吗?
编辑:代码段
int fruits[10];
printf("Address IN constant pointer is %p\n", fruits);
printf("Address OF constant pointer is %p\n", &fruits);
Run Code Online (Sandbox Code Playgroud)
输出:
Address IN constant pointer is 0xbff99ca8
Address OF constant pointer is 0xbff99ca8
Run Code Online (Sandbox Code Playgroud) 作为非C/C++专家,我总是将方括号和指针数组视为相等.
即:
char *my_array_star;
char my_array_square[];
Run Code Online (Sandbox Code Playgroud)
但是我注意到在结构/类中使用时它们的行为并不相同:
typedef struct {
char whatever;
char *my_array_star;
} my_struct_star;
typedef struct {
char whatever;
char my_array_square[];
} my_struct_square;
Run Code Online (Sandbox Code Playgroud)
下面的行显示16,whatever占用1个字节,my_array_pointer占用8个字节.由于填料,总结构尺寸为16.
printf("my_struct_star: %li\n",sizeof(my_struct_star));
Run Code Online (Sandbox Code Playgroud)
下面的行显示1,whatever占用1个字节,my_array_pointer不考虑帐户.
printf("my_struct_square: %li\n",sizeof(my_struct_square));
Run Code Online (Sandbox Code Playgroud)
通过玩耍,我注意到方括号被用作结构中的额外空间
my_struct_square *i=malloc(2);
i->whatever='A';
i->my_array_square[0]='B';
Run Code Online (Sandbox Code Playgroud)
线吹显示A:
printf("i[0]=%c\n",((char*)i)[0]);
Run Code Online (Sandbox Code Playgroud)
线吹显示B:
printf("i[1]=%c\n",((char*)i)[1]);
Run Code Online (Sandbox Code Playgroud)
所以我不能再说方括号等于指针了.但我想了解这种行为的原因.我害怕错过这些语言的关键概念.
我有两个指向双打的指针数组,我需要交换.而不是仅仅复制数组中的数据,将指针交换到数组会更有效.我一直认为数组名称本质上只是指针,但以下代码收到编译器错误:
double left[] = {1,2,3};
double right[] = {9,8,7};
double * swap = left;
left = right; // Error "ISO C++ forbids assignment of arrays"
right = swap; // Error "incompatible types in assignment of `double*' to `double[((unsigned int)((int)numParameters))]'"
Run Code Online (Sandbox Code Playgroud)
动态创建数组可以解决问题,但无法在我的应用程序中完成.我该如何工作?
#include <stdio.h>
int main(void){
char array[20];
printf( "\nSize of array is %d\n", sizeof(array) ); //outputs 20
printf("\nSize of &array[0] is %d\n", sizeof(&array[0]); //output 4
}
Run Code Online (Sandbox Code Playgroud)
上面的代码给出了20for sizeof(array)和4for sizeof(&array[0]).
我所知道的不是将数组作为参数,而是可以传递它的第一个元素.他们不应该给出与20相同的输出吗?为什么&array[0]给出4作为结果?据我所知,char存储在1个字节中?
我以为我真的理解这一点,并重新阅读标准(ISO 9899:1990)只是证实了我明显错误的理解,所以现在我问这里.
以下程序崩溃:
#include <stdio.h>
#include <stddef.h>
typedef struct {
int array[3];
} type1_t;
typedef struct {
int *ptr;
} type2_t;
type1_t my_test = { {1, 2, 3} };
int main(int argc, char *argv[])
{
(void)argc;
(void)argv;
type1_t *type1_p = &my_test;
type2_t *type2_p = (type2_t *) &my_test;
printf("offsetof(type1_t, array) = %lu\n", offsetof(type1_t, array)); // 0
printf("my_test.array[0] = %d\n", my_test.array[0]);
printf("type1_p->array[0] = %d\n", type1_p->array[0]);
printf("type2_p->ptr[0] = %d\n", type2_p->ptr[0]); // this line crashes
return 0;
}
Run Code Online (Sandbox Code Playgroud)
比较表达式my_test.array[0]并type2_p->ptr[0]根据我对标准的解释:
6.3.2.1数组下标 …
我应该为我的一门课回答一个家庭作业问题。具体来说,我应该说 C 中的某些数组是否被视为字符串。基于这篇文章 ( https://www.geeksforgeeks.org/strings-in-c-2/ ) 我知道字符串是一个字符数组,末尾带有空终止符。
我的主要挂断是询问一个看起来像这样的数组的问题的一部分:
char c1[] = { 'C', 'S', '\0', '3', '2', '4', '\0' };
Run Code Online (Sandbox Code Playgroud)
这显然是一个字符数组,末尾有一个空终止字符。但是,它是否仍被视为字符串,因为它中间还有一个空终止字符?这将如何影响字符串?
编辑:根据评论,我提供了问题的实际措辞:
“以下哪些数组可以被视为“字符串”,以便将它们用作 strcpy()、strncpy()、strcmp()、strncmp() 和类似字符串函数的参数(表示所有适用)?”
编辑:我给我的教授发了电子邮件,因为这个问题似乎措辞含糊(正如一些人指出的那样)。如果有人好奇,他告诉我“是的,它是一个字符串。关键是有一个空字符。当然这会影响任何字符串操作;字符串以空字符结尾。”
我正在编写一个小程序来进行一些数字运算,它需要在函数之间传递数组.函数应该接受并返回指针,对吧?
例如,这(我知道它可能不是最有效的):
int* reverse(int* l, int len) {
int* reversed = malloc(sizeof(*reversed)*len);
int i, j;
for (i = 0, j = len-1; i < len; i++, j--) {
reversed[j] = l[i];
}
return reversed;
}
Run Code Online (Sandbox Code Playgroud)
我使用指针吗?
可能重复:
通过指针从C和C++中的函数返回本地数据
我需要创建一个没有返回数组的参数的函数
我收到错误:"警告:函数返回局部变量的地址"
我的代码已经简化,便于阅读
int * getNums()
{
int nums[8];
nums = {1,2,3,4,5,6,7,8};
return nums;
}
Run Code Online (Sandbox Code Playgroud)
我被领导明白,当函数结束时指针丢失,但数组仍然会被发送?如果没有,在函数调用中返回没有参数的整数数组的好方法是什么?
提前感谢您的帮助!
干杯
当我声明一个像这样的新数组:
int foo[5]
Run Code Online (Sandbox Code Playgroud)
是foo真正的指针数组的第一个元素?我能做到这一点:
*(foo+2)
Run Code Online (Sandbox Code Playgroud)
访问数组的第三个元素?假设我正在制作2D数组:
int foo[3][4]
Run Code Online (Sandbox Code Playgroud)
是foo现在int**?
请记住一个让我烦恼的问题.
我知道pointers,并arrays在C不同,因为pointers存储的address,而arrays商店'real' values.
但是当涉及到时我会感到困惑string.
char *string = "String";
Run Code Online (Sandbox Code Playgroud)
我读到这行做了几件事:
编译器创建一个字符数组,它具有值String.
然后,该数组被认为是a pointer,程序将指针分配给指针字符串,该指针指向first element编译器创建的数组.
这意味着,arrays被视为pointers.
那么,这个结论是真是假,为什么呢?
如果是假,什么是那么之间的差异pointers和arrays?谢谢.