我正在编写一个小程序来进行一些数字运算,它需要在函数之间传递数组.函数应该接受并返回指针,对吧?
例如,这(我知道它可能不是最有效的):
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)
我使用指针吗?
在以下两行中,
char a[5]={1,2,3,4,5};
char *ptr=(char *)(&a+1);
printf("%d",*(ptr-1));
Run Code Online (Sandbox Code Playgroud)
这在屏幕上打印5个.当使用a而不是&a时,
char a[5]={1,2,3,4,5};
char *ptr=(char *)(a+1);
printf("%d",*(ptr-1));
Run Code Online (Sandbox Code Playgroud)
这打印1
a和&a都是数组的起始地址.所以为什么这有区别?
char*ptr =&a + 1;
显示警告.
当我声明一个像这样的新数组:
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**?
可能重复:
作为参数传递的Sizeof数组
我在c ++中使用这个sizeof运算符是愚蠢的,你知道为什么它是4和12吗?
void function (int arg[]) {
cout<<sizeof(arg)<<endl; // 4
}
int main ()
{
int array[] = {1, 2, 3};
cout<<sizeof array<<endl; // 12
function (array);
return 0;
}
Run Code Online (Sandbox Code Playgroud) 我得到了一个(C++)代码,其中使用了数组
void fun(int *& name){...}
Run Code Online (Sandbox Code Playgroud)
但这背后的想法是什么?我想这意味着"一个引用数组"但是当你只是将一个指针传递给第一个很好的元素时,不是吗?那么这样做的动机是什么?
例如,
int x[10];
int i = 0;
x = &i; //error occurs!
Run Code Online (Sandbox Code Playgroud)
根据C - A参考手册,数组名称不能是左值.因此,x不能是左值.但是,数组名称不能是左值的原因是什么?例如,为什么第三行发生错误?
在我本科 C 编程课程的大部分时间里,我们学习了 C99,我们的讲师从不费心教我们 C99 和以前版本之间的主要区别。
我们最近被告知,我们可能会被要求在下一次考试期间使用 C89 实施解决方案。
我的问题是关于函数内部声明和使用的可变长度多维数组的使用。
在 C99 中,我可以有这样的功能:
void func(int cols, int mat[][cols], int rows);
Run Code Online (Sandbox Code Playgroud)
而在 C89 中,VLA 和类似的装置是不合法的。有人告诉我,您需要改用指向指针的指针。所以像:
void func(int **mat, int cols, int rows);
Run Code Online (Sandbox Code Playgroud)
但是,我在理解方面遇到了问题:
mat[i][j]吗?int **mat;吗?我认为您必须使用malloc(),但我很难弄清楚确切的声明语句。边问。仍然关于可变大小的矩阵,有人告诉我有这样的设置:
int rows, cols;
// get rows and cols from stdinput
int mat[rows][cols];
Run Code Online (Sandbox Code Playgroud)
由于程序堆栈上的分配,这不是创建具有给定维度的矩阵的最佳方法。什么是更好的方法?
谢谢!
需要一些帮助来了解此代码段中究竟发生了什么.当我运行该程序时,它打印7.
#include <stdio.h>
int main() {
int a[] = {1,2,3,4,5,6,7,8,9};
int b[] = {1,2,3,4,5,6,7,8,9};
int c = 5;
int *p = a;
printf("--> %d", (c[b])[p]);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
当涉及到printf语句中的(c [b])[p]部分时,我只是有点困惑.任何帮助/解释将不胜感激.
我知道C语言中的指针是一个保存地址的变量。例如:
int myVar;
int *p;
p = &myVar;
printf("%p\n", p);
printf("%p\n", &p);
Run Code Online (Sandbox Code Playgroud)
输出将是两个不同的地址,第一个是myVar的地址,第二个是指针本身的地址,这意味着指针也是变量,并且在内存中有一个地址(如果我错了,请更正我)
但是我的问题是关于数组的,例如,我们有以下代码:
int myArray[10];
Run Code Online (Sandbox Code Playgroud)
所以在这里我认为myArray也是一个指针,它保存着myArray的起始地址,在本例中是myArray [0],所以当我打印myArray [0]和myArray的地址时,我得到相同的结果:
printf("%p\n", &myArray[0]);
printf("%p\n", myArray);
Run Code Online (Sandbox Code Playgroud)
现在,当我尝试打印myArray本身的地址时,这对我来说是令人困惑的部分:
printf("%p\n", &myArray);
Run Code Online (Sandbox Code Playgroud)
在这里,我得到了与我希望获得另一个地址(如指针)相同的结果。myArray是标签还是其他东西?
我有两个文件:
在文件1.c中,我有以下数组:
char p[] = "abcdefg";
Run Code Online (Sandbox Code Playgroud)
在文件0.c中,我有以下代码:
#include <stdio.h>
extern char *p; /* declared as 'char p[] = "abcdefg";' in 1.c file */
int main()
{
printf("%c\n", p[3]); /* crash */
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这是命令行:
gcc -Wall -Wextra 0.c 1.c
Run Code Online (Sandbox Code Playgroud)
我知道extern char *p应该是:extern char p[];但我只想解释为什么它在这种特殊情况下不起作用.虽然它在这里工作:
int main()
{
char a[] = "abcdefg";
char *p = a;
printf("%c\n", p[3]); /* d */
return 0;
}
Run Code Online (Sandbox Code Playgroud)