如何解决用C语言中的指针算术打印存储单元的内容
我想访问字符串的特定存储区域,并打印内容。
例如,以下代码提供了以下结果:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc,char *argv[]) {
char *string = "Lorem ipsum dolor sit amet";
printf("%.*s",15,&string[6]); // working
// printf("%.*s",&string + 6); // not working
return 0;
}
输出: ipsum dolor sit
是否有一种方法可以通过执行指针算术来达到相同的结果,即从基址求和并打印下一个n
内容(在本例中为15个字符)?
显然,在for循环中用大量文本执行printf("%.*s",&string[6]);
,这在时间上是非常昂贵的,我正在寻找一种替代方法,也许是直接访问已定义的内存地址的内容(我不确定示例是否如此。
解决方法
overflow: auto
是&string[6]
,它是&(string[6])
元素6的地址。
string
是&string + 6
,它是(&string) + 6
的地址加上6个对象。指针算术以指向类型为单位执行。由于string
是string
,因此char *
是&string
并指向char **
。因此,char *
尝试计算&string + 6
数组中string
之外的6个元素。
但是,char *
不在string
的数组中,因此C标准未定义此加法。它可能会产生一个指向程序内存中某处的指针,而char *
可能会打印出在该程序中找到的内容,但这不是您可以依靠的行为。
对于超出printf
开头六个字符的字符,正确的表达式应为string
。这等效于string + 6
。
显然,在for循环中使用大量文本进行
&string[6]
的时间非常昂贵,
要写入特定长度的字符,可以使用printf("%.*s",15,&string[6]);
,其中fwrite(source,1,length,stdout);
指向第一个字符,而source
是要写入的字符数。例如:
length
(在写入字符以外的数组元素时,将fwrite(source+6,stdout);
更改为1
以指定每个元素的大小。然后sizeof *source
是要写入的元素数。)
string[6]
是*(string + 6)
的语法糖,因此&string[6]
等同于&*(string + 6)
。编译器会为您取消&
和*
,因为它们是相反的,这意味着您要查找的操作是(string + 6)
。但是,这意味着使用指针算法不会更快,因为它可以编译为完全相同的代码。我不太确定您要在此处进行哪种优化。
也许在循环外创建格式字符串会节省一些开销:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc,char *argv[]) {
char *string = "Lorem ipsum dolor sit amet";
char format[32];
// Create the format string once
snprintf(format,32,"%%%ds\n",15);
printf(format,&string[6]);
return 0;
}
但是,如果没有更多信息,很难诊断出实际问题。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。