C 可视化printf中指针指示的内容
我遇到了这样一个函数,它对我反转一种特殊类型的单词非常有用。 我对while循环中复杂的指针算法有一个问题。如何使用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> #
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*上执行指针运算,您将看到它无法编译。