首页 > 函数后面的形参char *与指针*的问题

函数后面的形参char *与指针*的问题

好几个月没摸书了,最近摸起来,看到《Objective-c编程》第8章地址与指针时,又跌进一个坑里,求解答:

直接看代码(先贴一段第5章函数里的代码)

#include<stdio.h>

void congratulateStudent(char *student, char *course, int numDays)
{
    printf("%s has done as much %s programming as i could fit into %d days.\n",
        student, course, numDays);
}

int main(int argc, const char * argv[])
{
    congratulateStudent("Mark", "Cocoa", 5);
    return 0;
}

这里的输出结果为:

Mark has done as much Cocoa programming as i coule fit into 5 days.

但是我后来看到第8章地址与指针时,里面写道:

如果需要某个名称为ptr的变量用于保存浮点数变量的地址,则可以将其声明为:

float *ptr  

那么问题来了(不是想问挖掘机哪家强),这里的float *ptr和上面那段函数的形参char *student是一个意思么(都是指针的那个意思)?

如果是一个意思,那么,在函数后面取值时,直接用的是

printf("%s has done as much %s programming as i could fit into %d    days.\n",
student, course, numDays);

如果按照第8章地址与指针的内容来看,这段代码应该是:

printf("%s has done as much %s programming as i could fit into %d    days.\n",
*student, *course, numDays);

才对嘛(前两个参数加星号,去引用)

已经浆糊了,不知道有没有表达清楚,请各位帮帮我解惑〜非常感激。


在C语言中,字符串是以\0结尾的字符数组。字符串常用的表示形式是,用一个char *指针指向数组的第一个元素。"abc"这种叫做“字符串字面值”,可以直接赋给char *类型的指针。

char *s = "abc";

如果想要printf打印字符串,则前面要写为%s,后面传入char *而不是char。如果你够仔细的话,可以发现它的第一个参数即格式字符串,也是char *。字符串的打印方式是,用传入的地址开始一个字符一个字符地打印,直到遇到\0结束。

printf("Hello, %s!", "abc");

char *s = "abc";
printf("Hello, %s!", s);

我来简单回答你一下吧。char *str是一个字符指针可以理解吧?通常刚接触C语言的话都会有这么一个疑问,为什么这个字符指针又可以代表字符串呢?

首先看一个例子:

char c = 'c';
char *example = &c;
char *str= "abc";

在这个例子中,此处的examplestr都是字符指针,但他们是有区别的。定义一个像
"abc"这样的字符串字面量,其实做了2件事。

  1. 在内存地址申明一个长度为4个char字符长度的地址,里面的值分别为'a','b','c','\0'。这里的'\0'很关键,它是字符串结束的标志。也是它区别于example指针的本质区别。
  2. "abc"会返回'a'的地址,换句话说str是指向这个字符串的第一个字符的。

所以同样是char *指针,但有不同的用法,如果它作为一个字符串参数的话,必须声明为指针形式,这样编译器才能根据字符串的第一个字母的地址依次访问直到访问到\0

对于函数中,哪些参数需要传char *,哪些参数需要传char,我再举个例子。

#include <string.h>
char *str = "abc";
strlen(str);
/* 这里需要接受一个字符串参数
 * 函数的作用是返回一个字符串的长度
 * 函数最后返回值是3
 */

strchr(str, *str);
/* 这里接受一个字符串参数和一个字符参数
 * 函数的作用是找到字符参数是否出现在字符串中
 * 第二个参数既然是接受字符参数,那就需要用*str,根据我前面的描述,它的值其实就是'a'
 * 函数最后返回值是一个char指针,指向'a'的地址
 */

可以把字符串当成字符数组来理解。

比如有一个字符数组 cpp str[5] = "zhou";
数组名就是指针,cpp*str等于cppstr[0],也就是取第一个字符‘z’,所以cpp*str只能取第一个字符,不能取整个字符串。
为什么cppstr能取整个字符串呢,因为此时cppstr是地址,系统会从这个地址开始读取,直到遇到‘\0’。

个人理解,希望对你有帮助。


指针可以这样理解,指针这种类型,和int,char,double等等是一样的,只是它用来保存地址值的,而int变量保存整数,char变量保存字符,仅此而已,就char型指针或者int指针,本质是一样的,都是存放的地址,只不过那个地址所里面的变量类型不同而已,还有一种void型指针,就是可以放任何类型变量的地址。

先看下printf函数 格式化字符串说明:

/ * 'c' 代表字符常量, "i am a string." 代表字符串常量 */
printf("%c,%s", 'c', "i am a string.");

题主首先要明确一个概念:字符、和字符串是两个不同的东西。再来看下面一段代码:

/ * c 代表字符变量, str代表字符串变量同时是char指针类型的 */

char c = 'c';
char str[10] = "im am a string";
printf("%c,%c,%c,%s", c, *str, *(str+1), str);

如果对一个字符串变量执行取值操作,因为是char类型的指针,取出来的值就代表字符,和字符串是不一样的;char *类型变量作为一个整体才代表字符串,所以printf输出时不需要执行取值操作。

【热门文章】
【热门文章】