木子木子不死心 发表于 2022-8-9 06:06:42

关于指针的问题

请问下,指针的格式化输出中,到底什么情况下带*,什么时候不带。比如这里输出数组里面的各个字符串,为什么不带*
#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);
    }
      
    return 0;
}

wp231957 发表于 2022-8-9 06:46:35

这里星数组名指向了一个字符串类型的数组
那么去掉星号就是指向数组中的元素

liuzhengyuan 发表于 2022-8-9 08:36:27

说句题外话:
#define MAX 4
这句好像没用{:10_277:}

额外减小 发表于 2022-8-9 13:19:14

指针变量不是只可以存放地址吗??{:10_269:}

临时号 发表于 2022-8-9 13:27:30

指针在初始化的时候要加*表明他是一个指针
之后如果不加*的话表示这个指针所指向的地址
加*的话表示取出指针指向的地址的值
在你的程序中,names是一个指针,指向字符串数组的第一个元素的地址
而names其实等价于*(names+n)

一点点儿 发表于 2022-8-9 14:56:00

本帖最后由 一点点儿 于 2022-8-9 15:34 编辑

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

在楼主的代码中就是

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

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

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

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

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

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

带*是为了获取指针指向的内容,一般情况下输出指针指向的内容是要带*的

ba21 发表于 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;
}
页: [1]
查看完整版本: 关于指针的问题