【问题标题】:visualizing what pointers indicate in printf可视化 printf 中的指针指示的内容
【发布时间】:2012-08-30 19:16:39
【问题描述】:

我遇到过这样的功能,对于我反转特殊类型单词的任务非常有用。 我在 while 循环中遇到了复杂的指针算法问题。如何显示留在后面的数组索引号,例如。 word,dPtrsubword(在当前迭代中)与 printf ?

我只实现了减法值(subword-word)和(dPtr-dest)。

有没有办法创建一个“零”的“foo”指针,这样减法就可以单独给出检查值?

代码如下:

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <ctype.h>

int main(void)
{
    char* subword = NULL;
    char* dest;
    char* dPtr;

    size_t n, len;
    int len_int, n_int;

    char word[] = "-example-compound-word";
    len = strlen(word);
    len_int = (int)len;
    printf("string length is %d\n", len_int);
    dest = malloc(len+1);
    if (dest == NULL) return -1;

    dPtr = dest;

    while((subword = strrchr(word, '-'))!= NULL) {

        printf("the pointer values are: subword-word %ld, dPtr-dest %ld\n", (subword-word), (dPtr-dest));

        n = len - (subword-word) - (dPtr-dest);

        n_int = (int)n;
        printf("and the n is %d\n", n_int);

        if (n-1 > 0)
            strncpy(dPtr, subword+1, n-1);
        *subword = '\0';
        dPtr += n-1;
        *dPtr = '-';
        dPtr++;
    }
    strncpy(dPtr, word, len - (dPtr-dest));
    dest[len] = '\0';

    printf("the output is %s\n", dest);
    return 0;
}

提前致谢!

【问题讨论】:

  • 您的问题是如何打印指针? printf("%p\n", (void*)ptr); 做到了。
  • @DanielFischer 我知道,但它只以十六进制格式打印其地址。我想获得整数值作为当前处理的数组索引。如果只能使用我在上面代码中提出的方法来实现,那么如何为这种减法制作一个“foo”指针以获得处理后索引的绝对值?
  • subword - word 给出数组元素subword 指向的索引(作为ptrdiff_t)。一般来说some_type arr[100]; some_type *ptr = &amp;arr[12];ptr - arr 给出元素ptr 指向(这里是12)的索引。 “已处理索引的绝对值”是什么意思?您可以通过减去基指针来获得索引,在您的情况下为word resp。 dest,就像你一样。对不起,我不太明白你在问什么。
  • 你想打印复合词中的子词吗?如“示例”、“复合”、“单词”?
  • @Peter 只是为了明确说明为什么 Daniel 的答案是正确的,指针算术与整数算术不同,因为加数隐式地乘以您正在操作的类型的大小。这就是为什么它有效。尝试在 void * 上进行指针运算,您会发现它无法编译。

标签: c pointers pointer-arithmetic


【解决方案1】:

如果你有一个指向数组的指针p(或指向作为数组的malloced 内存块),你可以通过减去指向第一个元素的指针来获得指向数组元素的索引p.

subword 的情况下,您可以简单地使用word,因为在大多数情况下,数组名称(不是sizeof 的参数)都转换为指向它们的第一个元素的指针,所以在表达式中

subword - word

数组word 被转换为指向其第一个元素的指针,并且显式使用char* 的等效形式是

subword - &word[0]

dPtr的情况下,要减去的基指针是dest,它指向malloced内存块的第一个字节,并且

dPtr - dest

给出相应的索引。在char* 的情况下,索引与以字节为单位的偏移量相同,但一般来说,指向同一数组的相同对象类型的两个指针相减(或最后一个)也会产生两个指针之间的元素,而不是字节偏移量。

注意两个指针相减的结果是ptrdiff_t类型的值,而printf中对这些值使用的长度修饰符是t,所以

printf("the pointer values are: subword-word %ld, dPtr-dest %ld\n", (subword-word), (dPtr-dest));

应该是

printf("the pointer values are: subword-word %td, dPtr-dest %td\n", (subword-word), (dPtr-dest));

如果使用了l 长度修饰符,则值应转换为long int

【讨论】:

    猜你喜欢
    • 2020-12-12
    • 1970-01-01
    • 2014-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多