Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.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 可视化printf中指针指示的内容_C_Pointers_Pointer Arithmetic - Fatal编程技术网

C 可视化printf中指针指示的内容

C 可视化printf中指针指示的内容,c,pointers,pointer-arithmetic,C,Pointers,Pointer Arithmetic,我遇到了这样一个函数,它对我反转一种特殊类型的单词非常有用。 我对while循环中复杂的指针算法有一个问题。如何使用printf显示后面的数组索引号,例如word、dPtr或子词(在当前迭代中) 我只获得了减法值(子字)和(dPtr dest) 有没有一种方法可以创建一个“foo”指针,它将是“零”,这样减法就可以单独给出检查值 代码如下: #include <stdlib.h> #include <stdio.h> #include <string.h> #

我遇到了这样一个函数,它对我反转一种特殊类型的单词非常有用。 我对while循环中复杂的指针算法有一个问题。如何使用printf显示后面的数组索引号,例如
word
dPtr
子词
(在当前迭代中)

我只获得了减法值(子字)和(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;
}
#包括
#包括
#包括
#包括
内部主(空)
{
char*subword=NULL;
char*dest;
char*dPtr;
尺寸,长度;
int len_int,n_int;
字符词[]=“-示例复合词”;
len=strlen(单词);
len_int=(int)len;
printf(“字符串长度为%d\n”,len_int);
dest=malloc(len+1);
if(dest==NULL)返回-1;
dPtr=dest;
while((子字=strrchr(字“-”)!=NULL){
printf(“指针值为:子字%ld,dPtr dest%ld\n”,(子字),(dPtr dest));
n=len-(子字)-(dPtr dest);
n_int=(int)n;
printf(“n是%d\n”,n_int);
如果(n-1>0)
strncpy(dPtr,子字+1,n-1);
*子字='\0';
dPtr+=n-1;
*dPtr='-';
dPtr++;
}
strncpy(dPtr,word,len-(dPtr dest));
dest[len]='\0';
printf(“输出为%s\n”,dest);
返回0;
}

提前谢谢

如果将指针
p
插入数组(或插入充当数组的
malloc
ed内存块),可以通过从
p
中减去指向第一个元素的指针来获得指向数组元素的索引

子单词
的情况下,您可以简单地使用
单词
,因为数组名在大多数上下文中(不是作为
sizeof
的参数)转换为指向其第一个元素的指针,因此在表达式中也是如此

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

subword - &word[0]
dPtr
的情况下,要减去的基本指针是
dest
,它指向
malloc
ed内存块的第一个字节,并且

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

您的问题是如何打印指针<代码>printf(“%p\n”,(void*)ptr)是的。@Danielfisher我知道,但它只以十六进制格式打印地址。我想得到当前处理的数组索引的整数值。如果只能使用上面代码中介绍的方法实现,那么如何为这种减法生成一个“foo”指针以获得处理后索引的绝对值?
subword-word
给出数组元素
subword
指向的索引(作为
ptrdiff\u t
)。一般而言,
某些_型arr[100];某些类型*ptr=&arr[12]
ptr-arr
给出元素
ptr
指向的索引(此处为12)。你所说的“已处理索引的绝对值”是什么意思?在您的示例中,通过减去基本指针得到索引
dest
,就像你做的那样。对不起,我真的不明白你在问什么。你是想打印复合词中的子词吗?正如在“示例”、“复合”、“单词”?@Peter中,为了明确说明为什么Daniel的答案是正确的,指针算术不同于整数算术,因为加法是隐式乘以您正在操作的类型的大小。这就是为什么这是有效的。尝试在void*上执行指针运算,您将看到它无法编译。