Tag: 指针

使用NULL的指针算法

有人可以解释,为什么 int main(void) { char *a = NULL; int *b = NULL; double *c = NULL; printf(“\n%d %d %d\n%d %d %d\n\n”, (int) (a+1), (int)(b+1), (int)(c+1), (int) (a+5), (int)(b+7), (int)(c+17)); return 0; } 输出 1, 4, 8 5, 28, 136 我认为它与这些变量的字节大小有关。 但我不明白第二行输出。

为什么union *和struct *之间可能存在差异?

C标准要求所有指向union的指针具有相同的表示和对齐要求。 它对struct s的所有指针都强制要求。 因此,我的问题: 为什么标准不强制指向union的指针具有与struct s指针相同的表示和对齐要求? (我非常感谢一个利用这个实现的实现的例子。) 或者我只是错过了相关的文字? 标准草案n1570(C11最终草案)的相关引用: 6.2.5类型§28 指向void的指针应具有与指向字符类型的指针相同的表示和对齐要求。 48)类似地,指向兼容类型的合格或非限定版本的指针应具有相同的表示和对齐要求。 所有指向结构类型的指针都应具有相同的表示和对齐要求。 所有指向union类型的指针都应具有相同的表示和对齐要求。 指向其他类型的指针不需要具有相同的表示或对齐要求。

使用指针表示法在C中访问多维数组

设a是10个整数的一维数组,如下所示 int a[10]; 并为上面声明的数组表达式 a[i] 被评估为*(a + i)并给出存储在第i个索引处的值,例如 int a[5]={1,2,3,4,5}; 这里a [3]被评估为*(a + 3) ,它等于4 ,即存储在数组a的 第3个索引处的元素的值。 但是像这样的2Darrays的情况 int b[2][3]={ {1,2,3},{4,5,6} }; (这里我认为2D数组b是1D数组的数组,即b是具有2个元素的1D数组,每个元素本身是3个int的1D数组)如果我们使用带有数组名称的单个下标运算符 b[i] i = 1的上述表达式给出了存储元素4的地址,所以 在b是2D数组的情况下,如何计算表达式b [i] ? 在b是2D数组的情况下,如何计算表达式b [i] [j] ? 如何使用指针访问C中的多维数组元素。 在这里,我想了解编译器如何在内部处理多维数组? 如果b是2D数组, b会评估什么?

C – 如何将数组中的指针转换为索引?

在C的许多搜索函数中(如果找到结果,脑海中浮现),将返回指向数组中点的指针。 如何将此指针转换为搜索的数组中的索引(使用指针算法,我假设)。

函数中使用的内存何时变为空闲?(C编程)

以下是代码 代码: #include int * num(void); int main(void) { int * num2; num2 =num(); printf(“%d\n” , *num2); return 0; } int * num(void) { int num = 20; return # } 问题: 我们知道,函数num是函数num()本地函数,所以在这段代码中我尝试将函数中变量num的地址返回给调用它的函数,即main() 。 之后我只使用解除引用运算符来提取特定num变量的值并将其打印在main()函数中。 有一点我很困惑。 我记得我读过一本关于javascript的书,提到变量生命周期在函数内,这意味着在函数完成执行其指令并将控制权传递给调用它的函数之后,函数中每个变量的值将是干净的out(垃圾收集器)。但为什么在这段代码中我的main()函数仍然可以指向特定内存地址的值?

* p ++和++ * p之间的区别

int a = 5; int *p = &a; printf(“%d\n\n”, ++*p); printf(“%d\n”, *p++); ++*p相当于++(*p) 。 但*p++增加指针,而不是*p++指向的值。 但我无法理解为什么我的代码中的printf语句显示相同的值“6”。 这背后有什么具体的逻辑吗?

C编程(函数指针转换)

int eax = ((int(*)())(“\xc3 <- This returns the value of the EAX register"))(); 这是怎么回事? 字符串被转换为函数指针

使用和解除引用(void **)

我想传递一个指向函数的“多态”数组。 我可以在没有警告的情况下做以下事情: foo (void* ptr); bar() { int* x; … foo(x); } gcc显然会自动将x转换为(void*) ,这只是花花公子。 但是,当我执行以下操作时,我会收到警告: foo (void** ptr); bar() { int** x; // an array of pointers to int arrays … foo(x); } note: expected ‘void **’ but argument is of type ‘int **’ warning: passing argument 1 of ‘foo’ from incompatible pointer type [enabled […]

如果C有指针,为什么C需要数组呢?

如果我们可以使用指针和malloc来创建和使用数组,为什么数组类型存在于C中? 如果我们可以使用指针而不是没有必要吗?

是从指针类型转换为指向类型为safe的数组的指针吗?

几天前,我偶然发现了一个代码,其中广泛使用从指针到类型到指针到类型数组的转换,以提供内存中线性向量的二维视图。 为清楚起见,下面报告了这种技术的一个简单例子: #include #include void print_matrix(const unsigned int nrows, const unsigned int ncols, double (*A)[ncols]) { // Here I can access memory using A[ii][jj] // instead of A[ii*ncols + jj] for(int ii = 0; ii < nrows; ii++) { for(int jj = 0; jj < ncols; jj++) printf("%4.4g",A[ii][jj]); printf("\n"); } } int main() { const […]