鱼C论坛

 找回密码
 立即注册
查看: 1892|回复: 6

[已解决]关于指针的问题

[复制链接]
发表于 2022-8-9 06:06:42 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
请问下,指针的格式化输出中,到底什么情况下带*,什么时候不带。比如这里输出数组里面的各个字符串,为什么不带*
#include <stdio.h>

#define MAX 4

int main()
{
    char* names[] = {
        "one",
        "two",
        "three",
        "four"
    };
    
    int i = 0;

    for (i = 0; i < 4; i++)
    {
        printf("%s\n", names[i]);
    }
        
    return 0;
}
最佳答案
2022-8-9 14:56:00
本帖最后由 一点点儿 于 2022-8-9 15:34 编辑

指针变量的定义形式如:数据类型 *指针名,

在楼主的代码中就是

char* names[] = {
        "one",
        "two",
        "three",
        "four"
    };

上面代码定义指针数组names,用各字符串对它进行初始化(即把各字符串中的第1个字符的地址赋给指针数组的各个元素),指针数组指向字符串

字符串指针的指针名输出字符串内容而不是地址,
字符串指针的指针名代表字符串的首地址,但输出字符串指针名时输出的却是完整字符串,
如楼主代码中的
printf("%s\n", names[i])

因为在C语言中,在遇到字符型指针时会将其当作字符串名来处理,输出指针所指的字符串

所以这里输出数组里面的各个字符串,不带*

指针运算符*(间接寻址符):与&为逆运算,作用是通过操作对象的地址,获取存储的内容。例:x = &i,x 为 i 的地址,*x 则为通过 i 的地址,获取 i 的内容。

带*是为了获取指针指向的内容,一般情况下输出指针指向的内容是要带*的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-8-9 06:46:35 From FishC Mobile | 显示全部楼层
这里星数组名指向了一个字符串类型的数组
那么去掉星号就是指向数组中的元素
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-8-9 08:36:27 | 显示全部楼层
说句题外话:
#define MAX 4
这句好像没用
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-8-9 13:19:14 | 显示全部楼层
指针变量不是只可以存放地址吗??
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-8-9 13:27:30 | 显示全部楼层
指针在初始化的时候要加*表明他是一个指针
之后如果不加*的话表示这个指针所指向的地址
加*的话表示取出指针指向的地址的值
在你的程序中,names是一个指针,指向字符串数组的第一个元素的地址
而names[n]其实等价于*(names+n)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-8-9 14:56:00 | 显示全部楼层    本楼为最佳答案   
本帖最后由 一点点儿 于 2022-8-9 15:34 编辑

指针变量的定义形式如:数据类型 *指针名,

在楼主的代码中就是

char* names[] = {
        "one",
        "two",
        "three",
        "four"
    };

上面代码定义指针数组names,用各字符串对它进行初始化(即把各字符串中的第1个字符的地址赋给指针数组的各个元素),指针数组指向字符串

字符串指针的指针名输出字符串内容而不是地址,
字符串指针的指针名代表字符串的首地址,但输出字符串指针名时输出的却是完整字符串,
如楼主代码中的
printf("%s\n", names[i])

因为在C语言中,在遇到字符型指针时会将其当作字符串名来处理,输出指针所指的字符串

所以这里输出数组里面的各个字符串,不带*

指针运算符*(间接寻址符):与&为逆运算,作用是通过操作对象的地址,获取存储的内容。例:x = &i,x 为 i 的地址,*x 则为通过 i 的地址,获取 i 的内容。

带*是为了获取指针指向的内容,一般情况下输出指针指向的内容是要带*的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-8-9 15:35:35 | 显示全部楼层
* 在作为指针运算符时有2种含义。
1. 声明为指针类型 如:char* names[];        int *a;
2. 获取指针变量指向的值。 如:
int *a=8;
printf("%d\n", *a); // 此处*表示取值


注:为什么该段代码中 names 不用加*。
首先char* names[] 是一个指针数组。(指针数组是一个数组,数组里面存放的是指针)
{  "one",
        "two",
        "three",
        "four"} 字符串在c中是特别的,使用%s格式化输出时不用加 * (因为地址处就是 字符串了,所以不用*解引用)

参考代码:
#include <stdio.h>

int main()
{
    char *s = "one";

   printf("%s\n", s);

        
    return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-28 22:09

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表