相关疑难解决方法(0)

为什么函数不知道数组大小?

如果我写

int main()
{
    int a[100] = {1,2,3,4,};
    cout<<sizeof(a)/sizeof(a[0])<<endl; //a is a pointer to the first elem of array, 
                                        //isn't it
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我得到400!

如果我写

void func(int*a);

int main()
{
    int a[100] = {1,2,3,4,};
    func(a);
    return 0;
}

void func(int *a)
{
     cout<<sizeof(a)/sizeof(a[0])<<endl; //a is a pointer to the first elem of array
}
Run Code Online (Sandbox Code Playgroud)

然后我得到1!

那么为什么函数不知道数组大小呢?

c++ pointers function sizeof

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

方括号阵列

可能重复:
数组名是C中的指针吗?

所以,我通常使用指针声明数组.

但是,您也可以使用方括号表示法声明数组:

char a[] = "ok" ;
char b[] = "to" ;
char *pa = a ;

cout << "a " << sizeof( a ) << endl ;   // 3
cout << "pa " << sizeof( pa ) << endl ; // 4
Run Code Online (Sandbox Code Playgroud)

奇怪的是,sizeof( a )将是以字节为单位的数组的实际大小,而不是指针大小.

我发现这很奇怪,因为指针在哪里呢?方括号声明的数组实际上是一种带(sizeof(char)*numElements)字节的数据结构吗?

此外,您无法将a重新分配给b:

a = b ; // ILLEGAL.
Run Code Online (Sandbox Code Playgroud)

这是为什么?似乎a 是数组而不是指向数组的指针("左操作数必须是l值"a = b上面的错误).是对的吗?

c++ arrays square-bracket

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

函数调用中char []和char*之间的区别

我发现自己无法解释为什么以下代码有效.不用说,我对C++很陌生......

#include <cstdio>

void foo(char* p)
{
    p[0] = 'y';
}

int main()
{
    char a[1];
    a[0] = 'x';
    printf("a[0] = %c\n", a[0]);
    foo(a);
    printf("a[0] = %c\n", a[0]);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

该计划输出

a[0] = x
a[0] = y
Run Code Online (Sandbox Code Playgroud)

是什么让我感兴趣的是我没有将指针传递给foo.那么如何才能改变数组的值?这只适用于char数组吗?

char和char [1]之间差异的答案证实了我的观察,但它没有详细说明为什么会出现这种情况.

谢谢!

c c++ char

1
推荐指数
2
解决办法
2616
查看次数

尝试增加数组时出现"左值"错误

可能重复:
数组名是C中的指针吗?

假设我有一个char数组说arr和arr将代表第一个元素的地址,所以arr ++应该是完全合法的,那么为什么编译器会说'左值'.

如果我这样做:arr = arr + 1那么为什么它是无效的转换.我只是一个一个地增加指针.编译器告诉LHS操作数类型是char [4],但在RHS上它是char*.

main()
{
char arr[]={'a','b','c','d'};
for(;arr!=arr+4;arr++) //lvalue required 
printf("%c",*arr);
}
Run Code Online (Sandbox Code Playgroud)

c arrays lvalue

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

char数组的创建导致内存静态?

对于以下代码,我想知道是否只在堆栈中创建了一个数组,或者是否还有一个在静态中创建的数组.我只是对字符串中的数组创建感到困惑.

char str[] = "White";
Run Code Online (Sandbox Code Playgroud)

我假设这会在堆栈中创建一个名为str的指针,该指针指向具有以下内容的数组"White\0",在静态内存中.这是正确的假设吗?

c++ stack static memory-management

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

在运行时以标准C(不在C99中)声明数组的大小

数组需要在编译时定义大小.有没有可能在运行时使用malloc或者其他什么来定义数组的大小?

c malloc dynamic

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

是数组变量还是常量?

我只想知道:C变量或常量中的数组是什么?

我对char数组特别困惑.

c arrays variables pointers constants

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

数组名称和数组名称的地址如何打印相同的值?

考虑以下代码片段。

int main(){
    int x[2];
    x[0]=100;
    x[1]=200;
    printf("%d\n",x);
    printf("%d\n",&x);
    printf("%d\n",*x);
}   
Run Code Online (Sandbox Code Playgroud)

输出为(在三行中)

6487616  6487616 100
Run Code Online (Sandbox Code Playgroud)

我读过数组名称是指向数组第一个元素的指针。因此,'x' 的值打印了一个内存地址。但是,如果我尝试打印保存数组第一个元素地址的指针的地址,为什么还会打印相同的内存地址?它不应该打印另一个内存地址,仅仅是因为为了让变量存储内存地址,它应该是一个指针,并且该指针变量在 RAM 中也有一个内存地址。

int main(){
   int y = 10;
   int *p = &y;

   printf("%d\n",&y);
   printf("%d\n",&p);   
}
Run Code Online (Sandbox Code Playgroud)

上面的代码给出的输出为

6487628 6487616
Run Code Online (Sandbox Code Playgroud)

那么为什么这对数组不起作用呢?

c arrays memory-address

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

AVR C - const限定符在查找表声明中的行为如何?

我在论坛中发现了以下代码,我想知道const限定符在其中的表现如何?

const uint8_t data[] = { 15, 3, 41, 76, 2, 9, 5 };

val = data[5];
Run Code Online (Sandbox Code Playgroud)

现在,据我所知,const限定符使变量成为data[]只读,因此,在此示例中,无法修改数组的内容.令我困惑的是,限定符被应用于数组,这是一个指针,因此可以修改数组的内容,但指针本身不能.

我是对的吗?或者数组的内容是只读的?

c avr

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

是*相当于C中的[]?

编码:

char *argv[]
Run Code Online (Sandbox Code Playgroud)

会是这样的:

char **argv
Run Code Online (Sandbox Code Playgroud)

或者会:

char *string1;
int  *int_array;
Run Code Online (Sandbox Code Playgroud)

完全相同:

char string1[];
int  int_array[];
Run Code Online (Sandbox Code Playgroud)

c pointers

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