关于指针的问题
请问下,指针的格式化输出中,到底什么情况下带*,什么时候不带。比如这里输出数组里面的各个字符串,为什么不带*#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;
} 这里星数组名指向了一个字符串类型的数组
那么去掉星号就是指向数组中的元素 说句题外话:
#define MAX 4
这句好像没用{:10_277:} 指针变量不是只可以存放地址吗??{:10_269:} 指针在初始化的时候要加*表明他是一个指针
之后如果不加*的话表示这个指针所指向的地址
加*的话表示取出指针指向的地址的值
在你的程序中,names是一个指针,指向字符串数组的第一个元素的地址
而names其实等价于*(names+n) 本帖最后由 一点点儿 于 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 的内容。
带*是为了获取指针指向的内容,一般情况下输出指针指向的内容是要带*的 * 在作为指针运算符时有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]