Tag: 指针

所有指针都是从指向结构类型的指针派生的吗?

问题 是否所有指针都是从指向结构类型的指针派生的问题都不容易回答。 我认为这是一个重要问题,主要有以下两个原因。 A.缺少指向“任何”不完整或对象类型的指针,对方便的函数接口施加了限制,例如: int allocate(ANY_TYPE **p, size_t s); int main(void) { int *p; int r = allocate(&p, sizeof *p); } [ 完整代码示例 ] 指向“任何”不完整或对象类型的现有指针明确描述为: C99 §6.3.2.3 p1 : 指向void的指针可以转换为指向任何不完整或对象类型的指针。 […] 从指向“任何”不完整或对象类型的现有指针派生的指针,指向void的指针,严格地是指向void的指针,并且不需要使用从指向“任何”不完整的指针派生的指针进行转换或对象类型。 B.程序员根据他们对特定实现的经验,使用基于不需要的假设的约定,有意或无意地与指针的泛化相关,这种情况并不少见。 假设,例如可转换,可表示为整数或共享公共属性:对象大小,表示或对齐。 标准的话 根据C99 §6.2.5 p27 / C11 §6.2.5 p28 : […]所有指向结构类型的指针应具有相同的表示和对齐要求。 […] 其次是C99 TC3 Footnote 39 / C11 Footnote 48 : 相同的表示和对齐要求意味着可互换性作为函数的参数,函数的返回值和联合的成员。 […]

处理存储在C中多个字符串的指针数组中的单个字符串的问题

提供指向字符串的指针数组作为输入。 任务是反转存储在指针输入数组中的每个字符串。 我创建了一个名为reverseString()的函数,它反转传递给它的字符串。 据我所知,此function正常工作。 在指针的输入数组中存储/引用的字符串逐个发送到reverseString()函数。 但是当使用temp变量交换传递的字符串的值时,代码在reverseString()函数中的某个点挂起。 我无法弄清楚代码在交换值时挂起的原因。 请帮我解决一下这个。 代码如下: #include void reverseString(char*); int main() { char *s[] = {“abcde”, “12345”, “65gb”}; int i=0; for(i=0; i< (sizeof(s)/sizeof(s[0]) ); i++ ) { reverseString(s[i]); printf("\n%s\n", s[i]); } getch(); return 0; }//end main void reverseString(char *x) { int len = strlen(x)-1; int i=0; char temp; while(i <= len-i) { […]

如何通过指针在C中传递多个参数来调用函数?

我需要创建一个“函数调用者”函数:它接收一个generics函数指针( void * )和一个可变数量的参数作为参数,它必须调用此函数,传递参数,并返回一个指向返回值的generics指针。 但是,这个入口函数指针可能指向任何类型的函数(具有任何返回类型),甚至指向具有常量参数的函数。 它会是这样的: void * function_caller(void * function_pointer, …) { void * returning_value; // Call the function and get the returning value return returning_value; // this returning value will be properly casted outside } 这样,以下代码将起作用: int function1(int a, char b) { // … } void function2(float c) { // … } float […]

如何更改传递给C中函数的实际参数?

我想更改传递给函数的实际参数而不是它的副本。 例如: char str[] = “This is a string”; 我想在str的值不同的调用之后创建一个函数。 我试图创建一个接受char**作为参数的函数,但我无法得到我想要的东西。

void *和void **之间有什么区别?

这是一个特殊的属性,void *也可以被指定一个指向指针的指针并返回并接收原始值。 我在某处读过这行。 这意味着void*和void**是一样的吗? 有什么不同? 编辑 void*可以保存任何指针。 然后需要什么呢?

避免指针问题的最佳实践

与指针有关的程序员错误的实际结果是什么? 当程序员创建指针错误时会发生什么“不良影响”? 带代码的实际例子是优选的。

C中的悬空指针

我在C中编写了一个悬挂指针的程序。 #include int *func(void) { int num; num = 100; return &num; } int func1(void) { int x,y,z; scanf(“%d %d”,&y,&z); x=y+z; return x; } int main(void) { int *a = func(); int b; b = func1(); printf(“%d\n”,*a); return 0; } 即使指针悬空,我也将输出设为100 。 我在上面的函数func1()做了一个更改。 现在我在编译时分配值,而不是像上面的程序那样从标准输入中获取y和z的值。 我重新定义了func1() ,如下所示: int func1(void) { int x,y,z; y=100; z=100; x=y+z; return […]

检查指针是否指向给定数组

所以我有一个函数返回一个指向数组A中元素的指针。我有另一个函数将该指针作为参数。 但是,我需要该函数来处理它可能传递完全任意指针的可能性。 有没有办法能够检测指针是否指向结构中的某个位置? 在这种情况下,我的arraysA? 我见过类似的关于C ++的问题,但不是用C.

strcpy的C实现不会改变变量值

所以,我正在尝试实现我自己的strcpy以更好地理解指针在C中是如何工作的,到目前为止我都处于亏损状态。 我尝试了很多不同的方法,尝试使用网络中的代码,以后可能会使用它,但即便是那些也无法工作。 我相信我可能会在main方法上以错误的方式调用函数。 我将变量的指针传递给函数,以便函数可以更改变量的值,并在函数调用中,我给出指针的地址,以便方法可以获取正确的数据。 至少我相信这是它的工作原理,无论如何我都能理解。 以下是函数和方法调用: function调用: void my_strcpy( char *dest, const char* src ) { dest = malloc(sizeof(src)); while ( src != ‘\0’ ) { *dest = *src; src++; dest++; } } 主要: int main () { const char* s = “Hello World”; char* test = ‘d’; my_strcpy( &test, &s ); // Suposed to […]

直接为C指针赋值

我刚刚开始学习C,我一直在使用MinGW for Windows运行一些简单的程序来理解指针的工作原理。 我尝试了以下方法: #include int main(){ int *ptr; *ptr = 20; printf(“%d”, *ptr); return 0; } 正确编译但当我运行可执行文件时它不起作用 – 该值不会打印到命令行,而是我收到一条错误消息,指出.exe文件已停止工作。 但是,当我尝试将值存储在int变量中并将* ptr分配给该变量的内存地址时,如下所示: #include int main(){ int *ptr; int q = 50; ptr = &q; printf(“%d”, *ptr); return 0; } 它工作正常。 我的问题是,为什么我无法直接为指针设置文字值? 我已经在线查看教程以获得指针,其中大部分都是以与第二个示例相同的方式进行。 任何帮助表示赞赏。