Tag: 指针

C函数指针

static void increment(long long *n){ (*n)++; } struct test{ void (*work_fn)(long long *); }; struct test t1; t1.work_fn = increment; 我现在如何实际调用该函数? t1.work_fn(&n)?

将*&数组分配给指针

以下摘录来自Harbinson,Steele C:A Reference Manual(第5版) 。 根据这本书, p的两个任务是等价的。 7.5.6地址运营商 int a[10], *p; p = a; p = *&a; 然而,根据C faq Question 6.12, a是指向int的类型指针,而&a是指向int数组的类型指针。 所以我们应该在第二个赋值p = *&a得到一个类型错误,因为我们试图将一个int数组赋给一个指针。 为什么赋值p = *&a正确的?

strtok在同时处理两个字符串时

C语言中的新function并且非常混淆了如何使用strtok同时处理多个字符串,简单来说,我想使用strtok提取数字并进行比较。 #include #include int main() { char s1[100]=”11.54″; char s2[100]=”12.55″; const char tok[2]=”.”; char* token1=strtok(s1,tok); char* token2=strtok(s2,tok); while(token1 !=NULL && token2 !=NULL){ int temp=strcmp(token1,token2); if(temp==0){ token1=strtok(NULL,tok); token2=strtok(NULL,tok); } else if(temp<0){ printf("%d\n",-1); return; } else{ printf("%d\n",1); return; } } if(token1 !=NULL){ printf("%d\n",1); return; } if(token2 !=NULL){ printf("%d\n",-1); return; } printf("%d\n",0); return 0; } 但是当我使用strtok时,strtok(NULL,token)将指向当前字符串并将执行如下操作:11-> 12> 55-> […]

何时使用NULL以及何时在C中的链表中使用’\ 0’?

我在C中学到了: null char == ‘\0′ == NULL ,我在下面写了一个循环来读取C中char []的开头到结尾。 // case #1 char buf[32]; while (buf[i] != NULL){ //do something… } 但是,我的gcc编译器给了我一个警告:指针和整数之间的比较。 有人提到我混淆了两个不同的概念:NULL用于指针,而’\ 0’用于字符。 所以为了摆脱警告,我应该使用’\ 0’,因为我的循环测试了一个char。 现在我正在编写一个链表,并测试一个头指针是否指向一个节点。 因为它是struct,所以使用if (h1 == NULL)是合理的,但显然编译器也会在我使用if (h1 == ‘\0′)时编译,即使节点是结构但不是char。 有人可以提供一些帮助,为什么在这种情况下可以使用’\ 0’和NULL,而它们不能同时用于第一种情况? // case #2 struct ListNode { int val; struct ListNode *next; };

使用指针反转字符串

我正在尝试使用指针来反转一个字符串。当我尝试打印反向字符串而不是获得DCBA时,我只是作为BA出来?有人可以帮我这个吗? #include void reverse(char *); void main() { char str[5] = “ABCD”; reverse(str); } void reverse(char *str) { char *rev_str = str; char temp; while(*str) str++; –str; while(rev_str < str) { temp = *rev_str; *rev_str = *str; *str = temp; rev_str++; str–; } printf("reversed string is %s",str); }

正确性和不可变分配对象

在最近的讨论中(参见对这个答案的评论),R ..建议永远不要为指针到const类型创建别名,因为你无法在一致的C程序中轻松地释放引用的对象(请记住: free()采用非常量指针参数 和C99 6.3.2.3仅允许从非合格到合格的转换 )。 C语言显然假定任何已分配对象的所有者存在,即某个地方某人必须存储一个非const指针指向该对象,并且该人负责解除分配。 现在,考虑一个库分配和初始化从用户空间代码不可修改的对象,因此函数调用总是返回const -qualified指针。 显然,库是对象的所有者,并且应该保留非const指针,这有点傻,因为用户已经在每个库调用上提供了完全有效但指针的const副本。 要解除分配这样的对象,库必须丢弃const限定符; 据我所知,以下内容 void dealloc_foo(const struct foo *foo) { free((void *)foo); } 是有效的C; 如果foo参数另外restrict ,它将只是无效。 然而,抛弃const看起来有些黑客攻击。 除了从库函数的所有返回值中删除const之外还有另一种方法,它会丢失有关对象可变性的任何信息吗?

sscanf函数更改另一个字符串的内容

我在使用sscanf读取字符串时遇到问题。 我已经愚弄了代码以专注于问题。 下面是整个代码中的一个函数,它应该打开一个文件并读取一些内容。 但是sscanf表现得很奇怪。 例如,我声明一个名为atm的字符串,其内容为’ATOM’ 。 在sscanf之前,它将此字符串作为ATOM打印,而在它之后为空。 可能是什么问题呢? 我认为它必须是分配问题,但我找不到它。 我尝试了其他主题的一些建议,比如用其他东西替换%s ,但它没有帮助。 void Get (struct protein p, int mode, int type) { FILE *fd; //input file char name[100]=”1CMA”; //array for input file name char string[600]; //the array where each line of the data file is stored when reading char atm[100]=”ATOM”; char begin[4]; int index1 =0; fd […]

解释qsort库中使用的函数的typedef

我正在使用qsort库函数对结构元素数组进行排序,而在Internet上搜索时我找到了一个资源: INFO:使用C qsort()函数 @support.microsoft 对结构进行排序 。 我知道qsort函数需要通用指针进行类型转换。 但是我无法得到这一行: typedef int (*compfn) (const void*, const void*); 已经宣布的,以及随后的电话: qsort((void *) &array, // Beginning address of array 10, // Number of elements in array sizeof(struct animal), // Size of each element (compfn)compare // Pointer to compare function ); typedef是如何表现的,我的意思是我们究竟有什么类型的intdeffed int (*compfn)或int (compfn) ? 如果是前者,那么不应该调用(*compfn) ?

sizeof()如何通过引用参数传递

我传递了一个数组来运行,并试图找到数组的长度。 但结果没有预料到。 有人可以解释一下吗? int main() { int array[10]={0}; func(array); return 0; } void func(int arr[]) { printf(“length of an array is %d “,(sizeof(arr)/sizeof(arr[0])); } 它给出了答案2.当我在main函数中尝试相同的操作时,它工作正常(答案是10)。 //在linux中使用gcc编译器

理解指针和局部范围

假设我有以下function: char* allocateMemory() { char str[20] = “Hello world.”; return str; } int* another() { int x = 5; return &x; } int _tmain(int argc, _TCHAR* argv[]) { char* pString = allocateMemory(); printf(“%s\n”, pString); int* blah = another(); printf(“%d %d \n”, blah, *blah); return 0; } 第一个printf打印随机值,因为str是LOCAL SCOPE。 第二个printf打印正确的值,blah =地址为blah,* blah = 5 为什么局部作用域只影响处理数组的allocateMemory,而不是整数? 为什么第一个printf(返回char […]