Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 将字符指针的地址分配给int_Arrays_C_Pointers_Char - Fatal编程技术网

Arrays 将字符指针的地址分配给int

Arrays 将字符指针的地址分配给int,arrays,c,pointers,char,Arrays,C,Pointers,Char,我有一个函数,它获取一个整数作为参数。我想向它发送一个字符数组的地址,然后从它的地址打印数组。我的意思是: void printSomeThing(int x){ printf("Variable is: %s\n", /*What to type here?*/); //I want this printf to write "file.txt" } .... int main(){ char filename[10] = &

我有一个函数,它获取一个整数作为参数。我想向它发送一个字符数组的地址,然后从它的地址打印数组。我的意思是:

void printSomeThing(int x){
    printf("Variable is: %s\n", /*What to type here?*/);
    //I want this printf to write "file.txt"
}

....

int main(){
    char filename[10] = "file.txt";
    char *filePointer = filename;  //So it points to filename[0]'s address.
    int x = /*How to convert the address of the pointer (or the char array) to an integer?*/
    printSomeThing(x);
}
因此,我想将char数组的地址发送到函数并打印该地址的值


注意:我无法更改
printSomeThing
参数。它必须是一个
int

如果您不想只传递一个指向数组的指针,我认为最好的方法是将它转换为一个无符号的long,以便将它赋给函数

然而,编译器可能会抱怨您正在将整数值传递给printf中的字符串模式,但这是由于您使用的设计


如果不需要使用
printSomeThing(inti)
然后只需传递char*本身,或者如果需要传递其他内容,则使用void*,并使用某种标志告诉函数传递的类型

鉴于您不想只传递指向数组的指针,我认为最好的方法是将其转换为无符号long,以便将其传递给功能

然而,编译器可能会抱怨您正在将整数值传递给printf中的字符串模式,但这是由于您使用的设计


如果不需要使用
printSomeThing(int i)
则只需传递char*本身,如果需要传递其他内容,则使用void*并使用某种标志告诉函数传递的是什么类型

指针地址和整数之间转换的正确方法是使用
uintptpr\u t
整数类型。这是一种保证足够大以容纳地址的类型(不同于
int
)。此代码相当安全且可移植:

#include <stdio.h>

void printSomeThing(uintptr_t x){
    printf("Variable is: %s\n", (char*)x);
}

int main(){
    char filename[10] = "file.txt";
    char *filePointer = filename;  //So it points to filename[0]'s address.
    uintptr_t x = (uintptr_t)filePointer;
    printSomeThing(x);
}
#包括
无效打印内容(uintptr\u t x){
printf(“变量为:%s\n”,(char*)x);
}
int main(){
字符文件名[10]=“file.txt”;
char*filePointer=filename;//因此它指向文件名[0]的地址。
uintpttr_t x=(uintpttr_t)文件指针;
打印某物(x);
}

在指针地址和整数之间转换的正确方法是使用
uintpttr\t
整数类型。这是一种保证足够大以容纳地址的类型(不同于
int
)。此代码相当安全且可移植:

#include <stdio.h>

void printSomeThing(uintptr_t x){
    printf("Variable is: %s\n", (char*)x);
}

int main(){
    char filename[10] = "file.txt";
    char *filePointer = filename;  //So it points to filename[0]'s address.
    uintptr_t x = (uintptr_t)filePointer;
    printSomeThing(x);
}
#包括
无效打印内容(uintptr\u t x){
printf(“变量为:%s\n”,(char*)x);
}
int main(){
字符文件名[10]=“file.txt”;
char*filePointer=filename;//因此它指向文件名[0]的地址。
uintpttr_t x=(uintpttr_t)文件指针;
打印某物(x);
}
如果
sizeof(int)!=sizeof(char*)
,则通常您尝试执行的操作是不可能的

然而,仍然有一种方法可以让这项工作继续下去。在我告诉您如何实现这一点之前,让我重申一下其他人所说的:您不应该使用int作为指针。这不是一个好主意。我要演示的只是:一个演示。仅仅因为它可以做到并不意味着它应该做到

一种方法是将内存映射到小于
1If
sizeof(int)!=sizeof(char*)
,则通常您尝试执行的操作是不可能的

然而,仍然有一种方法可以让这项工作继续下去。在我告诉您如何实现这一点之前,让我重申一下其他人所说的:您不应该使用int作为指针。这不是一个好主意。我要演示的只是:一个演示。仅仅因为它可以做到并不意味着它应该做到


实现此功能的一种方法是将内存映射到小于
1的地址。您可以尝试将指针强制转换为
int
,然后返回到
char*
,但它可能不起作用(未定义的行为)。在许多系统上,这是不可能的,例如64位系统,其中指针为64位,但
int
仅为32位。代码会编译,但运行时很可能会崩溃。为什么需要这样做?你想解决的实际问题是什么?向函数传递指针值的方法是使用指针类型的参数。要做的第一件事是添加
printf(“%zu%zu\n”、sizeof(filePointer)、sizeof(x))到您的代码。如果它打印出两个不同的数字,那么你就无法实现你的期望。@NateEldredge是对的。正确的方法是将指针投射到C99中提供的
uintpttr\t
(如果我错了,请有人纠正我)。除此之外,将指针强制转换为整数通常会导致不好的情况发生。您可以尝试将指针强制转换为
int
,然后再返回到
char*
,但它可能不起作用(未定义的行为)。在许多系统上,这是不可能的,例如64位系统,其中指针为64位,但
int
仅为32位。代码会编译,但运行时很可能会崩溃。为什么需要这样做?你想解决的实际问题是什么?向函数传递指针值的方法是使用指针类型的参数。要做的第一件事是添加
printf(“%zu%zu\n”、sizeof(filePointer)、sizeof(x))到您的代码。如果它打印出两个不同的数字,那么你就无法实现你的期望。@NateEldredge是对的。正确的方法是将指针投射到C99中提供的
uintpttr\t
(如果我错了,请有人纠正我)。除此之外,将指针强制转换为整数通常会导致糟糕的事情发生。