C 显示指针内容。str与int的区别

C 显示指针内容。str与int的区别,c,pointers,C,Pointers,我正在玩各种各样的指针示例,有一个相当基本的问题 忽略事情是如何被操纵的,这只是获得更好理解的各种方式 这个问题与以下代码的输出有关 #include <stdio.h> #include <stdlib.h> void sampleForPosting(); int main(int argc, char** argv) { int size = 5; char* strVar; strVar = (char*)malloc(sizeof(c

我正在玩各种各样的指针示例,有一个相当基本的问题

忽略事情是如何被操纵的,这只是获得更好理解的各种方式

这个问题与以下代码的输出有关

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

void sampleForPosting();

int main(int argc, char** argv)
{
    int size = 5;
    char* strVar;
    strVar = (char*)malloc(sizeof(char) * size);

    int* intVar;
    intVar = (int*)malloc(sizeof(int) * size);

    *(strVar + 0) = '1';
    *(strVar + 1) = '2';
    *(strVar + 2) = '3';
    *(strVar + 3) = '4';
    *(strVar + 4) = '\0';

    *(intVar + 0) = 1;
    *(intVar + 1) = 2;
    *(intVar + 2) = 3;
    *(intVar + 3) = 4;

    printf("\n");
    printf("strVar        : %s\n", strVar); /// %s means to print out until \0 is reached

    printf("\n");
    printf("intVar        : %d\n", intVar);

}
问题:

当打印出字符串指针的内容时,它会打印出实际的字符串。 当打印出int指针的内容时,它会打印出数字所在的地址

为什么会有不同的行为?
该行为是由printf参数%s还是%n决定的?

%s
打印一个字符串,要打印一个字符串,必须传递第一个字符的地址,并且它会一直读取,直到您所说的
\0

%d
打印一个整数,要打印一个整数,您需要传递一个整数,但您要传递一个指针作为参数

因为
intVar
是一个指针,所以它会打印地址。如果要打印号码,必须使用
*intVar
*(intVar+x)

printf(“intVar:%d\n”,*intVar);
见:

格式字符串由[…]转换规范组成,每个规范都会导致获取零个或多个后续参数。每个转换规范都由字符
%
引入,并以转换说明符结束

对于转换说明符:

指定要应用的转换类型的字符。转换说明符及其含义如下:

diint参数被转换为有符号十进制
符号

s[…]参数为 应为指向字符类型数组的指针 (指向字符串的指针)

pvoid*指针参数是以十六进制打印的(就像用%#x或%#lx打印一样)


%s
打印字符串,要打印字符串,您必须传递第一个字符的地址,并且它将按照您的说明一直读取到
\0

%d
打印一个整数,要打印一个整数,您需要传递一个整数,但您要传递一个指针作为参数

因为
intVar
是一个指针,所以它会打印地址。如果要打印号码,必须使用
*intVar
*(intVar+x)

printf(“intVar:%d\n”,*intVar);
见:

格式字符串由[…]转换规范组成,每个规范都会导致获取零个或多个后续参数。每个转换规范都由字符
%
引入,并以转换说明符结束

对于转换说明符:

指定要应用的转换类型的字符。转换说明符及其含义如下:

diint参数被转换为有符号十进制
符号

s[…]参数为 应为指向字符类型数组的指针 (指向字符串的指针)

pvoid*指针参数是以十六进制打印的(就像用%#x或%#lx打印一样)


您是否尝试编译代码:

 warning: format ‘%d’ expects argument of type ‘int’, but argument 2 has type ‘int *’
编译将向您显示有关格式类型的警告

当您使用
%s
时,意味着您与编译器对话:
嘿,编译器,帮我打印字符串

当您使用
%d
时,意味着您与编译器对话:
嘿,编译器,帮我打印整数值
。因此编译器将打印变量
intVar

如果要打印指针的地址,应使用
%p

printf("intVar        : %p\n", intVar);

您是否尝试编译代码:

 warning: format ‘%d’ expects argument of type ‘int’, but argument 2 has type ‘int *’
编译将向您显示有关格式类型的警告

当您使用
%s
时,意味着您与编译器对话:
嘿,编译器,帮我打印字符串

当您使用
%d
时,意味着您与编译器对话:
嘿,编译器,帮我打印整数值
。因此编译器将打印变量
intVar

如果要打印指针的地址,应使用
%p

printf("intVar        : %p\n", intVar);

您是否希望
int
s的数组与
char
s的NUL终止数组一样处理?我实际收到一个编译警告,即%d需要int类型,但是该值实际上是int类型*您是否希望
int
s的数组与
char
s的NUL终止数组一样处理?我实际上收到了一条编译警告,即%d需要int类型,但该值实际上是int类型*根据您的回答,是参数决定了行为,正确吗?
%d
是一个格式标志。format标志指示函数如何解析参数<代码>%d解析整数。但是您传递了一个指针(它是一个长的无符号整数)。因此,函数将把这个指针转换成一个整数。如果要打印地址,可以使用标志
%p
,但如果要打印地址
intVar
处的值,这是一个整数,则必须取消指针的引用,以使用
*
访问其值。我已编辑以引用文档。请毫不犹豫地检查,以了解格式化是如何工作的。根据您的回答,是参数决定了行为,对吗?
%d
是一个格式标志。format标志指示函数如何解析参数<代码>%d解析整数。但是您传递了一个指针(它是一个l