Tag: 指针

数组衰减为指针的例外情况?

我在很多post中都看到“在大多数情况下,数组名称会衰减为指针”。 我可以知道在什么情况下/数组名称表达式不会衰减成指向其第一个元素的指针吗?

从函数返回数组/指针

我正在尝试创建一个从字符串派生的新整数数组。 例如 : char x[] = “12334 23845 32084”; int y[] = { 12334, 23845, 32084 }; 我无法理解如何从函数中返回一个数组(我理解不可能)。 我最初尝试过: /* Convert string of integers into int array. */ int * splitString( char string[], int n ) { int newArray[n]; // CODE return ( newArray ); } int main( void ) { int x[n] = splitString( […]

参数传递C – 指针,地址,别名

有人可以解释一下C参数传递的区别吗? 根据教授的说法,有4种不同的传递参数的方法 呼叫按值 地址呼叫(指针) 调用 – 别名 全局变量/静态变量 如果你能举一个例子,我将非常感谢,你的工作将受到赞扬。

C99是否保证arrays是连续的?

在另一个问题的热门评论主题之后,我开始讨论C99标准中有关C数组的内容和内容。 基本上当我定义一个2D数组如int a[5][5] ,标准C99是否保证它将是一个连续的整数块,我可以将其转换为(int *)a并确保我将拥有一个有效的一维25个整数数组。 正如我理解标准的那样,上面的属性隐含在sizeof定义和指针算术中,但是其他人似乎不同意并且说要转换为(int *)上面的结构给出了一个未定义的行为(即使他们同意所有现有的实现实际分配连续的价值观)。 更具体地说,如果我们认为一种实现可以检测数组检查所有维度的数组边界并在访问1D数组时返回某种错误,或者不能正确访问第1行以上的元素。 这样的实施可以是标准的编译吗? 在这种情况下,C99标准的哪些部分是相关的。

C中的数组增量运算符

我不明白以下代码的结果: #include #include int main() { int a[4]={1, 3, 5, 6}; //suppose a is stored at location 2010 printf(“%d\n”, a + 2); printf(“%d”, a++); return 0; } 为什么第二个printf函数会产生以下错误? error: lvalue required as increment operand

为什么我需要使用类型**指向类型*?

几天来,我一直在阅读“学习艰难的道路”,但这是我想要真正理解的东西。 作者Zed写道, char **用于指向(指向char的指针),并说这是必需的,因为我试图指向二维的东西。 这是在网页上写的内容 char *已经是“指向char的指针”,所以这只是一个字符串。 但是你需要2个级别,因为名称是2维的,这意味着你需要char **作为“指向(指向char的指针)”类型。 这是否意味着我必须使用一个可以指向二维的变量,这就是为什么我需要两个** ? 只是一点点跟进,这也适用于n维吗? 这是相关的代码 char *names[] = { “Alan”, “Frank”, “Mary”, “John”, “Lisa” }; char **cur_name = names;

为什么数组名称是指向数组第一个元素的指针?

总是这样,我的意思是,数组名称始终是指向数组的第一个元素的指针。为什么它是这样的?它是实现有点事物还是语言特征?

指针算术:++ * ptr或* ptr ++?

我正在学习C语言,并且很困惑++*ptr和*ptr++之间的差异。 例如: int x = 19; int *ptr = &x; 我知道++*ptr和*ptr++产生不同的结果,但我不确定为什么会这样?

C指向二维数组

我知道有几个问题可以提供良好(和工作)的解决方案,但没有恕我直言,这清楚地说明了实现这一目标的最佳方法。 所以,假设我们有一些2D数组: int tab1[100][280]; 我们想要制作一个指向这个2D数组的指针。 为实现这一目标,我们可以做到: int (*pointer)[280]; // pointer creation pointer = tab1; //assignation pointer[5][12] = 517; // use int myint = pointer[5][12]; // use 或者,或者: int (*pointer)[100][280]; // pointer creation pointer = &tab1; //assignation (*pointer)[5][12] = 517; // use int myint = (*pointer)[5][12]; // use 好的,两者似乎都运作良好。 现在我想知道: 什么是最好的方式,第一或第二? 两者都等于编译器? (速度,性能…) 这些解决方案中的一种比其他解决方案占用更多内存? 开发人员更常使用的是什么?

x86上的错误对齐指针

有人提供一个示例是否会因为错位而将指针从一种类型转换为另一种类型失败? 在对这个答案的评论中,两者都表示做了类似的事情 char * foo = …; int bar = *(int *)foo; 如果启用了对齐检查,即使在x86上也可能导致错误。 我在GDB中通过set $ps |= (1<<18)设置了alignment-check标志后试图产生错误条件,但没有任何反应。 工作(即非工作;))示例是什么样的? 答案中的代码片段都没有在我的系统上失败 – 我将尝试使用不同的编译器版本,稍后在不同的PC上。 顺便说一句,我自己的测试代码看起来像这样(现在也使用asm来设置AC标志和未对齐的读写): #include int main(void) { #ifndef NOASM __asm__( “pushf\n” “orl $(1<<18),(%esp)\n" "popf\n" ); #endif volatile unsigned char foo[] = { 1, 2, 3, 4, 5, 6 }; volatile unsigned int bar = 0; bar […]