如果我写
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中的指针吗?
所以,我通常使用指针声明数组.
但是,您也可以使用方括号表示法声明数组:
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++很陌生......
#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中的指针吗?
假设我有一个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) 对于以下代码,我想知道是否只在堆栈中创建了一个数组,或者是否还有一个在静态中创建的数组.我只是对字符串中的数组创建感到困惑.
char str[] = "White";
Run Code Online (Sandbox Code Playgroud)
我假设这会在堆栈中创建一个名为str的指针,该指针指向具有以下内容的数组"White\0",在静态内存中.这是正确的假设吗?
数组需要在编译时定义大小.有没有可能在运行时使用malloc或者其他什么来定义数组的大小?
考虑以下代码片段。
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)
那么为什么这对数组不起作用呢?
我在论坛中发现了以下代码,我想知道const限定符在其中的表现如何?
const uint8_t data[] = { 15, 3, 41, 76, 2, 9, 5 };
val = data[5];
Run Code Online (Sandbox Code Playgroud)
现在,据我所知,const限定符使变量成为data[]只读,因此,在此示例中,无法修改数组的内容.令我困惑的是,限定符被应用于数组,这是一个指针,因此可以修改数组的内容,但指针本身不能.
我是对的吗?或者数组的内容是只读的?
编码:
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)