Tag: 指针

使用C中的指针冒泡排序结构

我想使用冒泡排序算法和C中的指针对结构数组进行排序。我有一个汽车结构: typedef struct{ char model[30]; int hp; int price; }cars; 我为12个项目分配内存: cars *pointer = (cars*)malloc(12*sizeof(cars)); 并从文件中读取数据: for (i = 0; i model, &(pointer+i)->hp, &(pointer+i)->price); } 我将指针ptr传递给bubbleSort函数: bubbleSort(pointer, number); 这是我的bubbleSort函数: void bubbleSort(cars *x, int size) { int i, j; for (i=0;i<size-1;i++) { int swapped = 0; for (j = 0; j hp > (x+j+1)->hp ) { […]

初始化指针指针数组

这个例子工作正常: static char *daytab[] = { “hello”, “world” }; 这不是: static char *daytab[] = { {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}, {0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31} }; 我看到它的方式是第一个示例创建一个数组,该数组填充了指向两个字符串文字(它们本身就是数组)的指针。 第二个例子,IMO应该是相同的 – 创建一个数组并用指向两个char数组的指针填充它。 有人可以向我解释为什么第二个例子是错的吗? PS你可能会这样写(没有测试过): static char a[] = {0, 31, 28, […]

C:声明一个指向常量字符数组的常量指针

我试图理解数组声明,constness及其生成的变量类型。 允许以下内容(由我的编译器): char s01[] = “abc” ; // typeof(s01) = char* const char s02[] = “abc” ; // typeof(s02) = const char* (== char const*) char const s03[] = “abc” ; // typeof(s03) = char const* (== const char*) 或者,我们可以手动声明数组大小: char s04[4] = “abc” ; // typeof(s04) = char* const char s05[4] = “abc” ; […]

将char指针数组传递给C中的函数?

我有以下代码: int main(){ char **array; char a[5]; int n = 5; array = malloc(n *sizeof *array); /*Some code to assign array values*/ test(a, array); return 0; } int test(char s1, char **s2){ if(strcmp(s1, s2[0]) != 0) return 1; return 0; } 我正在尝试将char和char指针数组传递给函数,但上面的代码会导致以下错误和警告: temp.c:在函数’main’中: temp.c:6:5:警告:隐式声明函数’malloc'[-Wimplicit-function-declaration] temp.c:6:13:警告:内置函数’malloc’的不兼容隐式声明[默认启用] temp.c:10:5:警告:隐式声明函数’test'[-Wimplicit-function-declaration] temp.c:顶级: temp.c:15:5:错误:’test’的冲突类型 temp.c:15:1:注意:具有默认促销的参数类型不能与空参数名称列表声明匹配 temp.c:10:5:注意:先前的’test’隐式声明就在这里 temp.c:在函数’test’中: temp.c:16:5:警告:隐式声明函数’strcmp'[-Wimplicit-function-declaration] 我试图了解问题所在。

如何明智地解释这个编译器警告?

当我执行这个问题的代码时,我得到了这个警告: warning: format ‘%d’ expects argument of type ‘int’, but argument 2 has type ‘long int’ [-Wformat=] printf(“PQ: %d, P: %d, Q: %d”, (p – q), p, q); ~^ ~~~~~~~ %ld 作为reflection修复,我使用%ld来打印两个指针的减法。 编制者同意了。 幸运的是,我看到另一位用户提到应该使用%td的评论,因为减法的结果类型是ptrdiff_t 。 这个答案证实了这一说法。 现在从GCC的stddef.h头文件中,我可以看到这些类型在这种情况下是等价的: typedef __PTRDIFF_TYPE__ ptrdiff_t; #define __PTRDIFF_TYPE__ long int 但是,我只是建议对OP的错误(或多或少)修复,使用%ld而不是%td 。 有没有办法让我理解单独的编译器警告是不够的? 或者也许明智地解释警告本身,而不仅仅是反应。

是UB访问一个二维数组行结束的元素吗?

以下程序的行为是否未定义? #include int main(void) { int arr[2][3] = { { 1, 2, 3 }, { 4, 5, 6 } }; int *ptr1 = &arr[0][0]; // pointer to first elem of { 1, 2, 3 } int *ptr3 = ptr1 + 2; // pointer to last elem of { 1, 2, 3 } int *ptr3_plus_1 = […]

在数组中找到孤立的整数

如果可以的话,请参考这个 hackerrank挑战。 问题是在数组中找到孤立的整数,给定一个数组只包含一对,除了一个孤独的整数。 问题出在这个测试用例上 9 4 9 95 93 57 4 57 93 9 9是数组大小,下面是数组 查看// ——突出显示的代码部分 如果我将scanf(“%d”,&n)置于int arr [n]代码上方工作正常,但反过来会产生可怕的结果。 请帮帮我 #include int lonely_integer(int* a, int size); int main(){ //n is size of array, i is counter variable int n, i, result; // ——————— int arr[n]; scanf(“%d”, &n); // ——————— printf(“%d\n”, n); for(i = 0; […]

递归指针

我正在和一个刚接触过低级语言的人和今天的手动内存管理人员交谈,并尽力解释指针。 然后他想出了: #include int main() { int v = 0; void* vp = &v; int i = 0; for(; i < 10; ++i) { printf("vp: %p, &vp: %p\n", vp, &vp); vp = &vp; } } 这个输出是: vp: 0xbfd29bf8, &vp: 0xbfd29bf4 vp: 0xbfd29bf4, &vp: 0xbfd29bf4 vp: 0xbfd29bf4, &vp: 0xbfd29bf4 vp: 0xbfd29bf4, &vp: 0xbfd29bf4 vp: 0xbfd29bf4, &vp: […]

指针条件while(* s1 ++ = * s2 ++)

int main() { char str1[] = “Overflow”; char str2[] = “Stack”; char *s1 = str1, *s2=str2; while(*s1++ = *s2++) printf(“%s”, str1); return 0; } 当这种情况破裂时 (while(*s1++ = *s2++)) 请解释逻辑 输出来了

通过多个function通过引用传递

大家好。 我正在为学校做一个项目,我需要通过多个函数通过引用传递一些参数。 我理解如何通过引用将变量声明的位置传递给另一个函数,如下所示: main() { int x = 0; int y = 0; int z = 0; foo_function(&x, &y, &z); } int foo_function(int* x, int* y, int* z) { *x = *y * *z; return 0; } 但是,如何将foo函数中的x,y和z传递给另一个函数? 这样的东西给了我各种编译器警告。 int foo_function(int* x, int* y, int* z) { *x = *y * *z; bar(&x, &y, &z); […]