Tag: 指针

在C中的单独函数中初始化指针

我需要做一个简单的事情,我过去常常用Java做过很多次,但是我坚持使用C(纯C,而不是C ++)。 情况如下: int *a; void initArray( int *arr ) { arr = malloc( sizeof( int ) * SIZE ); } int main() { initArray( a ); // a is NULL here! what to do?! return 0; } 我有一些“初始化”函数,它应该给一些指定的指针分配一些分配的数据(无关紧要)。 我应该如何给一个函数指针以便对这个指针进行修改,然后可以在代码中进一步使用(在该函数调用之后返回)?

从K&R书中解释malloc的这种实现

这是Kernighan和Ritchie关于C的书的摘录。 它显示了如何实现malloc一个版本。 虽然评论很好,但我很难理解它。 有人可以解释一下吗? typedef long Align; /* for alignment to long boundary */ union header { /* block header */ struct { union header *ptr; /* next block if on free list */ unsigned size; /* size of this block */ } s; Align x; /* force alignment of blocks */ }; typedef union […]

对多维数组的一维访问:它是明确定义的行为吗?

我想我们都同意,通过以一维方式解引用(可能是偏移的)指向其第一个元素的指针来访问真正的多维数组被认为是惯用的C,例如: void clearBottomRightElement(int *array, int M, int N) { array[M*N-1] = 0; // Pretend the array is one-dimensional } int mtx[5][3]; … clearBottomRightElement(&mtx[0][0], 5, 3); 然而,我的语言律师需要说服这实际上是明确定义的C! 特别是: 标准是否保证编译器不会在例如mtx[0][2]和mtx[1][0]之间插入填充? 通常,索引关闭数组的末尾(除了结尾之外)是未定义的(C99,6.5.6 / 8)。 所以以下内容显然未定义: struct { int row[3]; // The object in question is an int[3] int other[10]; } foo; int *p = &foo.row[7]; // ERROR: A […]

如何在C中对齐指针

有没有办法在C中对齐指针? 假设我正在将数据写入数组堆栈(因此指针向下),我希望我写的下一个数据是4对齐的,所以数据写入4的倍数的内存位置,我该怎么做那? 我有 uint8_t ary[1024]; ary = ary+1024; ary -= /* … */ 现在假设ary指向位置0x05 。 我希望它指向0x04 。 现在我可以做到 ary -= (ary % 4); 但是C不允许模数指针。 有没有与架构无关的解决方案?

指针的大小可以在数据和函数指针之间变化吗?

我刚刚阅读了C FAQ的指针部分 。 它讨论了无法使用void *指针来保存函数指针,因为指向数据的指针和指向函数的指针在某些平台上可能具有不同的大小,而void *仅保证足够大以容纳指向数据的指针。 任何人都可以给出一个平台的例子,其中指向数据的指针和指向函数的指针实际上有不同的大小?

使用C中的指针的const用法

我正在讨论C并且有一个关于使用指针的const用法的问题。 我理解以下代码: const char *someArray 这是定义指向char类型的指针, const修饰符意味着不能更改someArray存储的值。 但是,以下是什么意思? char * const array 这是指定参数的另一种方法,该参数是指向名为“array”的数组的char指针,该数组是const且无法修改? 最后,这个组合意味着什么: const char * const s2 作为参考,这些来自第7章中的Deitel C编程书,所有这些都被用作传递给函数的参数。

是否可以在函数内部分配数组并使用引用返回它?

我尝试过使用tripple指针,但它仍然失败。 码: #include #include int set(int *** list) { int count, i; printf(“Enter number:\n”); scanf(“%d”, &count); (*list) = (int **) malloc ( sizeof (int) * count); for ( i = 0; i<count;i++ ) { (**list)[count] = 123; } return count; } int main ( int argc, char ** argv ) { int ** list; int […]

在%d之后使用带有空格的scanf(“%d”)

今天在我的c类中我遇到了scanf()命令,我们只是学习指针而且我们得到了一个问题,要求我们得到一个数组,然后在没有使用[]的情况下将其打印出来,除了声明(int)数组。 当然,这似乎是一块蛋糕,但不是你不小心写的时候: scanf(“%d”,arr + i); 您是否注意到%d后的空格? 当然确实花了我一段时间来弄明白但是由于某些原因导致循环变得疯狂,我希望你们帮助我(和我的老师)弄清楚为什么会这样。 例: #include #define LEN 10 void arrayInput(int * arr, unsigned int len); void arrayReverseOutput(int * arr, unsigned int len); int main(void) { int arr[LEN] = { 0 }; arrayInput(arr, LEN); arrayReverseOutput(arr, LEN); system(“pause”); return 0; } void arrayInput(int * arr, unsigned int len) { unsigned int i = […]

使用printf打印出浮动值

#include #include int main(void) { int x, *ptr_x; float f , *ptr_f; ptr_f = &f; ptr_x = &x; *ptr_x = 5; *ptr_f = 1.5; //printf(“%d %f\n”, f,x); printf (“\n\nxd = %d \t xf = %f \n ff = %f \t fd = %d”, x,x,f,f); return 0; } ff =%f的输出不是预期的。 xd = 5 xf = 0.000000 […]

指针/地址差异

为什么两个地址之间的区别是错误的? http://codepad.org/NGDqFWjJ #include int main() { int i = 10, j = 20; int *p = &i; int *q = &j; int c = p – q; printf(“%d\n”, p); printf(“%d\n”, q); printf(“%d”, c); return 0; } 输出: -1083846364 -1083846368 1