Tag: 指针

在C中交换指针(char,int)

当我在C中交换指针时,我一直在努力理解不同的行为。如果我想交换两个int指针,那么我可以做 void intSwap (int *pa, int *pb){ int temp = *pa; *pa = *pb; *pb = temp; } 但是,如果我想交换两个char指针,我需要做类似的事情 void charSwap(char** a, char** b){ char *temp = *a; *a = *b; *b = temp; } 因为如果我这样做 void charSwap(char* a, char* b){ char temp = *a; *a = *b; *b = temp; } 编译器抱怨表达式* a = […]

指针作为C中的函数参数

如果我有这个代码,例如: int num = 5; int *ptr = # 以下两个function有什么区别? void func(int **foo); void func(int *foo); 我在哪里调用函数: func(&ptr); 我意识到两者的前者将指针指向一个参数,而第二个只取一个指针。 如果我传入func(&ptr) ,我实际上是在传入一个指针。 指针指向另一个指针有什么区别? 我相信后者会给出一个不兼容的警告,但只要你知道你在做什么,似乎细节无关紧要。 似乎可能为了可读性和理解,前者是更好的选择(2星指针),但从逻辑的角度来看,有什么区别?

何时数组名称或函数名称“转换”为指针? (在C中)

1) 误解 : 每当使用C语言声明数组时,都会隐式创建指向数组第一个元素的指针(数组的名称)。 (是吗?我不这么认为!) 这个页面的前两行(虽然我不确定信息的正确性)说明相同。 正如我们所看到的,当我们声明一个数组时,为数组的单元分配一个连续的内存块,并且还分配一个指针单元(适当类型)并初始化为指向数组的第一个单元。 但是当我输出该指针中包含的地址和该指针的地址时 ,它们会变成相同的。 所以,我认为毕竟不会创建指针。 2)我从这个问题中选了这个 。 在大多数情况下,数组名称将转换为指针。 任何人都可以详细解释编译器何时决定将数组名转换为指针, 为什么 ? PS:请解释一下function 。 同样在这个链接中,给出了一个例子,说对于函数int square(int,int) ,任何square , &square , *square , **square指向相同的函数指针。 你可以解释吗? 编辑:代码段 int fruits[10]; printf(“Address IN constant pointer is %p\n”, fruits); printf(“Address OF constant pointer is %p\n”, &fruits); 输出: Address IN constant pointer is 0xbff99ca8 Address OF constant […]

使用等于运算符==在C中比较两个字符串的相等性

int main (int argc, **argv) { if (argv[1] == “-hello”) printf(“True\n”); else printf(“False\n”); } #。/ myProg -hello 假 为什么? 我意识到strcmp(argv[1], “-hello”) == 0返回true …但为什么我不能使用相等运算符来比较两个C字符串?

是否允许编译器回收释放的指针变量?

有人声称 编译器可以自由地将指针变量重用于其他目的之后 realloc 被释放 ,所以你不能保证它具有与之前相同的价值 即 void *p = malloc(42); uintptr_t address = (uintptr_t)p; free(p); // […] stuff unrelated to p or address assert((uintptr_t)p == address); 可能会失败。 C11附件J.2读 使用指向通过调用free或realloc函数释放的空间的指针的值(7.22.3)[ 未定义 ] 但附件当然不是规范性的。 附件L.3(规范性的,但可选的)告诉我们,如果 引用通过调用free或realloc函数释放的空间的指针值(7.22.3)。 结果被允许是关键的未定义行为。 这证实了这一说法,但我希望从标准本身而不是附件中看到适当的引用。

使用指针修改字符串时发生分段错误?

上下文 我正在学习C,我正在尝试使用指针来反转字符串。 (我知道你可以使用一个数组;这更多的是学习指针。) 问题 尝试运行下面的代码时,我不断遇到分段错误。 GCC似乎不喜欢*end = *begin; 线。 这是为什么? 特别是因为我的代码几乎与另一个问题中讨论的非邪恶C函数相同 #include #include void my_strrev(char* begin){ char temp; char* end; end = begin + strlen(begin) – 1; while(end>begin){ temp = *end; *end = *begin; *begin = temp; end–; begin++; } } main(){ char *string = “foobar”; my_strrev(string); printf(“%s”, string); }

需要指针指针

存储指针地址需要什么? int a = 2; int *p = &a; int **q = &p; 有实际用途吗? 实时应用程序。

动态分配矩阵的function

我想创建一个函数来分配(使用malloc / calloc )一个声明为双指针的矩阵。 我理解双指针矩阵如何工作以及如何使用malloc分配它,但是当我传递我的矩阵(在main()声明并初始化为NULL )时,我的程序崩溃了。 我想错误是我的allocMatrix()函数,因为如果我在main分配矩阵,所有工作都顺利进行。 谢谢 :-) 主要: #include #include #include “Data.h” #define ROW 5 #define COL 5 int main(void) { int i,j, ret; int nRow, nCol; int **mat=NULL; // double pointer matrix nRow = 0; nCol = 0; //Insert n of row and columns printf(“Insert n of rows and columns:\n”); scanf(“%d %d”, […]

通过malloc进行VLA和动态内存分配有什么区别?

我很好奇这个: 有什么不同之处: const int MAX_BUF = 1000; char* Buffer = malloc(MAX_BUF); 和: char Buffer[MAX_BUF];

两个字符串指向不同字符串文字的地址是相同的

#include #include int main() { char * p = “abc”; char * p1 = “abc”; printf(“%d %d”, p, p1); } 当我打印两个指针的值时,它打印相同的地址。 为什么?