Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/22.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
C语言中处理数组的未知方法_C - Fatal编程技术网

C语言中处理数组的未知方法

C语言中处理数组的未知方法,c,C,您好,我正在阅读一些代码,看到了这一行。我目前正在学习C,我不明白为什么[num%2]前面有一个字符串 如果需要上下文,可以在此处阅读整个方法: *--p = "0123456789abcdef"[num % 2]; char*toBin(无符号整数) { 静态char-retbuf[33]; int i=0; 对于(;i元素…谢谢Karoly,我知道这个概念。但在这里,我们在[…]前面有一个字符串,而不是数组的名称。在我看来,它对“01”[num%2]的作用与此相同,因为它只使用数组的前2个

您好,我正在阅读一些代码,看到了这一行。我目前正在学习C,我不明白为什么[num%2]前面有一个字符串

如果需要上下文,可以在此处阅读整个方法:

*--p = "0123456789abcdef"[num % 2];
char*toBin(无符号整数)
{
静态char-retbuf[33];
int i=0;
对于(;i<33;i++)
{
retbuf[i]=“0”;
}
char*p;
p=&retbuf[sizeof(retbuf)-1];
*p='\0';
做
{
*--p=“0123456789abcdef”[num%2];
num/=2;
}
而(num!=0);
返回retbuf;
}

我知道这个方法在做什么:它将一个整数转换成二进制形式。我只是不明白第一句话。我知道它以某种方式将数组(第二个)最后位置的位放入retbuf,我也理解它为什么使用num%2来获取0和1。但是我不明白为什么前面有一个字符串。

我不知道为什么这里有一个六边形字符串,但它所做的是将int num除以2,如果它是偶数
n%2=0
,那么字符串的元素0将被拾取('0'),如果它是奇数
n%2=1
,那么它将拾取数组的元素1('1')。在循环中,指针
p
在retbuff中向后移动,以按顺序放置每个字符(“0”或“1”)


这是一种非常奇怪的方法,我不知道为什么这里有六边形字符串,但它所做的是将int num除以2,如果它是偶数
n%2=0
,那么字符串的元素0将被拾取('0'),如果它是奇数
n%2=1
,那么它将拾取数组的元素1('1')。在循环中,指针
p
在retbuff中向后移动,以按顺序放置每个字符(“0”或“1”)


这是一种非常奇怪的方法

使用字符串相当于使用数组。在这种特定情况下,以下内容就足够了:

char * toBin(unsigned int num)
{
    static char retbuf[33];
    int i = 0;
    for (; i < 33; i++)
    {
        retbuf[i] = '0';
    }
    char *p;
    p = &retbuf[sizeof (retbuf) - 1];
    *p = '\0';
    do
    {
        *--p = "0123456789abcdef"[num % 2];
        num /= 2;
    }
    while (num != 0);
    return retbuf;
}

因为只有阵列的前2个位置在使用中。我假设整个字符串“01…ef”来自转换为十六进制的类似函数。

使用字符串相当于使用数组。在这种特定情况下,以下内容就足够了:

char * toBin(unsigned int num)
{
    static char retbuf[33];
    int i = 0;
    for (; i < 33; i++)
    {
        retbuf[i] = '0';
    }
    char *p;
    p = &retbuf[sizeof (retbuf) - 1];
    *p = '\0';
    do
    {
        *--p = "0123456789abcdef"[num % 2];
        num /= 2;
    }
    while (num != 0);
    return retbuf;
}

因为只有阵列的前2个位置在使用中。我假设整个字符串“01…ef”来自转换为十六进制的类似函数。

请记住,在C中,字符串只是一个字符数组。所以

*--p = "01"[num % 2];
就好像你有

*--p = "0123456789abcdef"[num % 2];

正如其他人所指出的,
*--p
将被设置为
'0'
'1'
,这取决于
num
是偶数还是奇数

请记住,在C中,字符串只是一个字符数组。所以

*--p = "01"[num % 2];
就好像你有

*--p = "0123456789abcdef"[num % 2];

正如其他人所指出的,
*--p
将被设置为
'0'
'1'
,这取决于
num
是偶数还是奇数

在C中,常量字符串指向其第一个元素的内存位置

不带方括号的数组名也指向数组第一个元素的地址。所以常量字符串中的元素可以用和数组相同的方式访问

请参见下面的示例

char digits[] = "0123456789abcdef";
....
*--p = digits[num % 2];
它将打印字符“o”2次。
希望您能理解。

在C中,常量字符串指向其第一个元素的内存位置

不带方括号的数组名也指向数组第一个元素的地址。所以常量字符串中的元素可以用和数组相同的方式访问

请参见下面的示例

char digits[] = "0123456789abcdef";
....
*--p = digits[num % 2];
它将打印字符“o”2次。
希望您能理解。

为了记录在案,为了防止将来有人在这个问题上绊倒,发布的函数很糟糕,不要使用它。实现该算法的正确方法如下:

char arr[10] = "Hello";

printf("%c %c", arr[4], "Hello"[4]);

作为记录,为了防止将来有人在这个问题上绊倒,发布的函数很可怕,不要使用它。实现该算法的正确方法如下:

char arr[10] = "Hello";

printf("%c %c", arr[4], "Hello"[4]);


数组[索引]
->
元素
…谢谢Karoly,我知道这个概念。但在这里,我们在[…]前面有一个字符串,而不是数组的名称。在我看来,它对
“01”
[num%2]的作用与此相同,因为它只使用数组的前2个字符。整个“01..ef”可能来自转换hex@DennisvonEich:将字符串视为字符数组。此函数非常糟糕。它总是返回一个静态内存块,这非常容易出错。因为您不知道返回值何时会隐式无效。
array[index]
->
element
…谢谢Karoly,我知道这个概念。但在这里,我们在[…]前面有一个字符串,而不是数组的名称。在我看来,它对
“01”
[num%2]的作用与此相同,因为它只使用数组的前2个字符。整个“01..ef”可能来自转换hex@DennisvonEich:将字符串视为字符数组。此函数非常糟糕。它总是返回一个静态内存块,这非常容易出错。因为你不知道什么时候你的返回值会被隐式作废。这正是我需要的信息。非常感谢。这正是我需要的信息。非常感谢。是的,这并不能完全回答这个问题,但在这个帖子中必须有一个关于理智的呼吁,否则将来发现它的新手可能会开始编写问题中所发布的代码。这是一个大学的作业。也许这个函数在给定的上下文中有意义?@DennisvonEich什么上下文?他们在教你如何不写C代码吗?具体来说,原始函数存在以下问题:返回指向局部静态变量的指针总是很危险的:如果在同一表达式中多次调用同一函数,并且该函数不可重入,则会导致计算顺序问题,这意味着它将导致CRA