Tag: 指针

关于指针和多维数组的困惑

如果可能的话: MyFunction(int *array, int size) { for(int i=0 ; i<size ; i++) { printf(“%d”, array[i]); } } main() { int array[6] = {0, 1, 2, 3, 4, 5}; MyFunction(array, 6); } 为什么以下不是? MyFunction(int **array, int row, int col) { for(int i=0 ; i<row ; i++) { for(int j=0 ; j<col ; j++) { printf(“%d”, array[i][j]); […]

constness和指针指针

我对const关键字非常困惑。 我有一个函数接受一个字符串数组作为输入参数和一个接受可变数量的参数的函数。 void dtree_joinpaths(char* output_buffer, int count, …); void dtree_joinpaths_a(char* output_buffer, int count, const char** paths); dtree_joinpaths在从参数列表构建了一个字符串数组后,在内部调用dtree_joinpaths_a 。 void dtree_joinpaths(char* output_buffer, int count, …) { int i; va_list arg_list; va_start(arg_list, count); char** paths = malloc(sizeof(char*) * count); for (i=0; i < count; i++) { paths[i] = va_arg(arg_list, char*); } va_end(arg_list); dtree_joinpaths_a(output_buffer, count, paths); } 但是gcc编译器给了我以下错误消息: […]

数组和数组有什么区别?

假使,假设 int array[16]; 有一种称为数组到指针转换的标准转换,因此array将被隐式转换为int*类型,但为什么&array等于array ? 例如, int array[16]; void *p = array; void *q = &array; printf(“%p\n”, p); printf(“%p\n”, q); 这将给出相同的地址和没有编译错误。 为什么?

可靠地确定数组中的元素数量

每个C程序员都可以使用这个众所周知的宏来确定数组中元素的数量: #define NUM_ELEMS(a) (sizeof(a)/sizeof 0[a]) 这是一个典型的用例: int numbers[] = {2, 3, 5, 7, 11, 13, 17, 19}; printf(“%lu\n”, NUM_ELEMS(numbers)); // 8, as expected 但是,没有什么能阻止程序员意外地传递指针而不是数组: int * pointer = numbers; printf(“%lu\n”, NUM_ELEMS(pointer)); 在我的系统上,这打印2,因为显然,指针是整数的两倍。 我想过如何防止程序员错误地传递指针,我找到了一个解决方案: #define NUM_ELEMS(a) (assert((void*)&(a) == (void*)(a)), (sizeof(a)/sizeof 0[a])) 这是有效的,因为指向数组的指针与指向其第一个元素的指针具有相同的值。 如果改为传递指针,指针将与指向自身的指针进行比较,这几乎总是假的。 (唯一的例外是递归的void指针,也就是指向自身的void指针。我可以忍受它。) 意外地传递指针而不是数组现在在运行时触发错误: Assertion `(void*)&(pointer) == (void*)(pointer)’ failed. 太好了! 现在我有几个问题: 我使用assert作为逗号表达式有效标准C的左操作数吗? 也就是说,标准是否允许我使用assert作为表达式? 对不起,如果这是一个愚蠢的问题:) 可以在编译时以某种方式完成检查吗? […]

sizeof(int)== sizeof(void *)?

是否存在与指针大小相同的整数类型? 所有微体系结构都保证?

关于Pointers To函数声明中的函数

#include #include int fun1() { printf(“I am fun1.”); return 0; } int fun2(int fun()) { fun(); return 0; } int main() { fun2(fun1); return 0; } 上面的程序可以运行。 就我而言,我可以理解int fun2(int (*fun)()) ,但我不知道int fun2(int fun())工作的。 谢谢。

关于使用指针修改const变量的困惑

以下示例在我的理解中增加了混淆。 我无法理解如何修改const变量local。 请帮我理解一下。 /* Compile code without optimization option */ // volatile.c #include int main(void) { const int local = 10; int *ptr = (int*) &local; printf(“Initial value of local : %d \n”, local); *ptr = 100; printf(“Modified value of local: %d \n”, local); return 0; } $ gcc volatile.c -o volatile -save-temps $ ./volatile […]

C – SizeOf指针

char c[] = {‘a’,’b’,’c’}; int* p = &c[0]; printf(“%i\n”, sizeof(*p)); //Prints out 4 printf(“%i\n”, sizeof(*c)); //Prints out 1 我对这部分代码非常困惑。 p和c都表示第0个索引处的数组c的地址。 但是为什么sizeof(* p)打印4? 不应该是1吗?

如何通过c 中的指针传递二维数组

可能重复: 将表示2D数组的指针传递给C ++中的函数 我试图通过指针将我的二维数组传递给函数,并希望修改值。 #include void func(int **ptr); int main() { int array[2][2] = { {2, 5}, {3, 6} }; func(array); printf(“%d”, array[0][0]); getch(); } void func(int **ptr) { int i, j; for (i = 0; i < 2; i++) { for (j = 0; j < 2; j++) { ptr[i][j] = 8; } } […]

仅使用返回的指针获取malloc的大小

我希望能够改变我的数组的大小,所以我这样创建一个: int* array; array = malloc(sizeof(int)*10);//10 integer elements 我可以像往常一样使用它像数组一样,但是当我试图找到它的大小时: size = sizeof(array)/sizeof(int); 我得到了答案1,因为它没有将其识别为指向数组 如何获得arrays的大小? (我知道它在技术上不是一个数组,但有没有办法计算出分配的内存块的整个大小?) 我也正确地假设我在描述中说明了什么? 如果我在技术上对某事有误,请纠正我。