我认为以下程序会清楚地说明我的疑问,所以我发布了该程序:
#include <stdio.h>
int main() {
int a[]={1,2,3,4,5};
if(&a[0] == a)
printf("Address of first element of an array is same as the value of array identifier\n");
if(&a == a)
printf("How can a value and address of an identifier be same?!");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这是输出链接:http : //ideone.com/KRiK0
可能重复:
数组名是C中的指针吗?
我正在运行以下代码
#include <stdio.h>
int main()
{
int a[4] = {1,2,3,4};
int (*b)[4] = &a;
int k = sizeof(a);
printf("\n\n%d\n\n", k);
printf("a = %u, b = %u, *b = %u, data = %d", a, b, *b, **b);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我得到了以下输出
a = 3485401628, b = 3485401628, *b = 3485401628, data = 1
Run Code Online (Sandbox Code Playgroud)
这里我将a的地址分配给b,因为b的类型是int**,但是在输出中我得到的是a指向的地址与b指向的地址相同.
这对我来说似乎有些困惑.解释是什么?
我对数组和指针感到很困惑.
请告诉我以下两个代码有什么区别?
int main()
{
int i,*p;
for(i=0;i<5;i++)
{
p[i]=i;
printf("%d",p[i]);
}
return 0;
}
int main()
{
int i,p[5];
for(i=0;i<5;i++)
{
p[i]=i;
printf("%d",p[i]);
}
return 0;
}
Run Code Online (Sandbox Code Playgroud) 我正在学习C++.我发现指针与数组具有相同的功能,例如a[4],a可以是指针和数组.但是,正如C++定义的那样,对于不同长度的数组,它是一种不同的类型.实际上当我们将一个数组传递给一个函数时,它会自动转换为指针,我认为这是另一个证明数组可以被指针替换的证据.所以,我的问题是:
为什么C++不用指针替换所有数组?
char str[80];
cin >> str+1;
cout << str+1;
Run Code Online (Sandbox Code Playgroud)
这+1是什么意思?它是如何工作的?任何帮助,将不胜感激.谢谢你的答复.
我只是想知道为什么,当我将数组传递给函数时,例如,初始化它们时,它们实际上是初始化的.由于inic函数中的变量完全独立于main函数中的变量(不涉及指针),inic函数如何能够初始化数组v的值?inic函数里面的数组不是一个单独的东西吗?
#include <stdio.h>
void inic(int s[], int n)
{
int i;
for(i=0; i<n; i++)
s[i]=0;
}
main()
{
int v[10];
int x[20];
inic(v, 10);
inic(x, 20);
}
Run Code Online (Sandbox Code Playgroud)
如果我也展示这个例子可能会更清楚:
#include <stdio.h>
void value(int n)
{
n = 2;
}
main()
{
int x=1;
value(x);
printf("X is %d\n", x); //The output would be 1. The function *value* doesn't affect X.
}
Run Code Online (Sandbox Code Playgroud)
那么为什么阵列不同呢?
我写了这段代码并且"它有效" - 但是怎么样?
我没有在我的main函数中声明一个数组; 我只是在带有指针的过程中添加了一个标准整数.例如,它将通过更改循环运行的次数来扫描2或20个整数的数组.
#include <stdio.h>
void test(int *v, int n) {
int i;
for (i = 0; i < n; i++) {
printf("[%d]: ", i);
scanf("%d", &v[i]);
}
printf("\n\n#############\n\n");
for (i = 0; i < n; i++) {
printf("[%d]: %d\n", i, v[i]);
}
}
int main(void) {
int array;
int t = 10;
test(&array, t);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我真的不知道我写的是什么,直到我意识到它在起作用.我试图搜索"指针数组"或一般指针,但找不到上面这个例子的任何具体答案.我希望我知道更多要找的东西.
我在阅读另一个问题的绝佳答案,给出了以下具体示例:
char[] array = {'a', 'b', 'c', '\0'};
Run Code Online (Sandbox Code Playgroud)
Thing* t = new Thing[size];
t[someindex].dosomething();
Run Code Online (Sandbox Code Playgroud)
我评论说,作为一种好的做法,您应该添加delete[]第二个示例,因为这是人们忘记导致内存泄漏的位。
但是我不记得您是否需要delete[]一开始。我不认为您会这样做,因为没有,new所以它在堆栈中,但是我不是100%确信那是正确的。
我在C++中使用指针时遇到了一些问题.我用不同大小的数组实现了三种方法,但计算方法相同.所以我决定提取计算并将它们放在一个需要数组的新方法中.但这不起作用,我不知道如何修改我的程序.
void method1() {
float a[3][3];
calculate(a, 3);
}
void method2() {
float a[4][4];
calculate(a, 4);
}
void method3() {
float a[5][5];
calculate(a, 5);
}
void calculate(float *param[], int n) {
// Code
}
Run Code Online (Sandbox Code Playgroud)
我知道我可以使用全局变量或向量等但我需要这个结构中的逻辑.
这是编译器错误:
Test.cpp: In function 'void method1()':
Test.cpp:7:16: error: cannot convert 'float (*)[3]' to 'float**' for argument '1' to 'void calculate(float**, int)'
Test.cpp: In function 'void method2()':
Test.cpp:12:16: error: cannot convert 'float (*)[4]' to 'float**' for argument '1' to 'void calculate(float**, int)'
Test.cpp: In function 'void …Run Code Online (Sandbox Code Playgroud) 如果我声明两个数组,一个在堆栈上,一个在堆上,我在打印变量名时会得到不同的行为(如果重要的话,在gdb中).
int array_on_stack[5];
int * array_on_heap = new int[5];
Run Code Online (Sandbox Code Playgroud)
现在在gdb中,我逐步执行每行代码,然后打印变量名,期望获取每个代码的内存地址.
print array_on_stack
print array_on_heap
Run Code Online (Sandbox Code Playgroud)
但是array_on_stack它打印数组的内容而不是内存地址.为了获取内存地址,我需要命令print &array_on_stack.这表明这array_on_stack不是一个指针.有人可以解释这两个声明在如何访问其内存地址方面的区别以及为什么会出现这种情况?