相关疑难解决方法(0)

何时数组名称或函数名称"转换"为指针?(在C中)

1) 误解:

  • 每当用C语言声明数组时,都会隐式创建指向数组第一个元素的指针(数组的名称).(是吗?我不这么认为!)

  • 这个页面的前两行(虽然我不确定信息的正确性)说明相同.

    正如我们所看到的,当我们声明一个数组时,为数组的单元分配了一个连续的内存块,并且还分配了一个指针单元(适当类型)并初始化为指向数组的第一个单元.

  • 但是,当我输出包含的地址该指针和地址该指针,就变成是相同的.所以,我认为毕竟不会创建指针.

2)我从这个问题中选了这个.

  • 在大多数情况下,数组名称将转换为指针.

任何人都可以详细解释编译器何时决定数组名称转换为指针,为什么

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 arrays pointers function-pointers function

17
推荐指数
1
解决办法
2745
查看次数

方括号数组和指针数组有什么区别?

作为非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)

所以我不能再说方括号等于指针了.但我想了解这种行为的原因.我害怕错过这些语言的关键概念.

c c++ arrays pointers

15
推荐指数
2
解决办法
8499
查看次数

使用C++中的指针交换数组

我有两个指向双打的指针数组,我需要交换.而不是仅仅复制数组中的数据,将指针交换到数组会更有效.我一直认为数组名称本质上只是指针,但以下代码收到编译器错误:

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)

动态创建数组可以解决问题,但无法在我的应用程序中完成.我该如何工作?

c++ arrays swap pointers

12
推荐指数
4
解决办法
3万
查看次数

为什么sizeof(array)和sizeof(&array [0])给出不同的结果?

#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个字节中?

c sizeof

12
推荐指数
3
解决办法
1760
查看次数

C中的指针与数组,非平凡差异

我以为我真的理解这一点,并重新阅读标准(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 arrays pointers

11
推荐指数
2
解决办法
7966
查看次数

C中字符串定义的具体细节是什么?

我应该为我的一门课回答一个家庭作业问题。具体来说,我应该说 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() 和类似字符串函数的参数(表示所有适用)?”

编辑:我给我的教授发了电子邮件,因为这个问题似乎措辞含糊(正如一些人指出的那样)。如果有人好奇,他告诉我“是的,它是一个字符串。关键是有一个空字符。当然这会影响任何字符串操作;字符串以空字符结尾。”

c arrays string null-terminated

11
推荐指数
1
解决办法
231
查看次数

指针和数组在C中有什么不同吗?

我正在编写一个小程序来进行一些数字运算,它需要在函数之间传递数组.函数应该接受并返回指针,对吧?

例如,这(我知道它可能不是最有效的):

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 arrays pointers

7
推荐指数
1
解决办法
818
查看次数

从没有参数的函数返回整数数组

可能重复:
通过指针从C和C++中的函数返回本地数据

我需要创建一个没有返回数组的参数的函数

我收到错误:"警告:函数返回局部变量的地址"

我的代码已经简化,便于阅读

int * getNums()
{
    int nums[8];
    nums = {1,2,3,4,5,6,7,8};
    return nums;
}
Run Code Online (Sandbox Code Playgroud)

我被领导明白,当函数结束时指针丢失,但数组仍然会被发送?如果没有,在函数调用中返回没有参数的整数数组的好方法是什么?

提前感谢您的帮助!

干杯

c++ arrays pointers return function

7
推荐指数
3
解决办法
1万
查看次数

C++指针与数组表示法

当我声明一个像这样的新数组:

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**

c++ arrays pointers

7
推荐指数
1
解决办法
2443
查看次数

C中数组,指针和字符串之间的差异

请记住一个让我烦恼的问题.

我知道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.

那么,这个结论是真是假,为什么呢?

如果是假,什么是那么之间的差异pointersarrays?谢谢.

c arrays string pointers

7
推荐指数
3
解决办法
6693
查看次数