V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
drlalll
V2EX  ›  C

C 语言 数组 指针 函数 问题

  •  
  •   drlalll · 2017-03-02 21:33:06 +08:00 · 1983 次点击
    这是一个创建于 2808 天前的主题,其中的信息可能已经有所发展或是发生改变。

    以下是一段验证代码:出自 C primer plus p297 11.5.1

    #include<stdio.h>
    #include<string.h>
    //声明一个函数,其作用是在指定的长度终止字符串 
    void fit(char * str , int n); 
    int main(void)
    {
    	//数组 n1[] 
    	char n1[] = "1234567890";
    	//一个指向字符串“ 1234567890 ”的指针 
    	char * n2 = "1234567890";
    	fit(n1,5);
    	fit("01234567890",5);
    	//经过验证 n1 是可以正常输出的, n2 不可以 
    	printf("n1 = %s\nn2 = %s/n",n1,n2);
    	return 0; 
    }
    
     void fit(char * str , int n)
     {
     	if(strlen(str) > n)
     		*(str + n) = '\0';
     }
     
    

    函数 fit()为什么只能接受数组类型,但是不能接受字符串那???

    使用字符串数组可以正常输出但是使用字符串就不行,不知道原因是什么,希望对 C 语言有了解的大神可能点拨点拨!

    我现在的理解是字符串是常量无法修改,但是为什么本程序又用指针 * str 来传递参数?指针应该是可以同时传递字符串数组和字符串的???

    我刚接触 C 语言,可能会犯一些常识性错误,代码书写格式也可能会不规范,请大家多多包涵!!

    2 条回复    2017-04-11 16:38:01 +08:00
    hx1997
        1
    hx1997  
       2017-03-03 00:23:56 +08:00 via Android
    你的理解很有问题,建议你回头看看前面的内容。

    首先,我假定你说的「字符串数组」实际上是指字符数组;「字符串」是指字符串字面值。

    > 函数 fit()为什么只能接受数组类型,但是不能接受字符串那?
    fit() 事实上接受的是 char * 类型,即一个指针,这种情况下如果传递一个数组,这个数组会退化成指向其首元素的指针,因此可以接受。修改字符串字面值在 C 中是未定义行为,由于具体实现中常把字符串字面值放在只读内存区域,因此修改常常会导致内存访问违例。

    > 指针应该是可以同时传递字符串数组和字符串的?
    指针传递的只是字符数组首元素的*地址*而非数组本身,对于字符串字面值也只是传递其起始*地址*,而非字符串字面值本身。
    tyzual
        2
    tyzual  
       2017-04-11 16:38:01 +08:00
    这段代码槽点略多。不知道怎么吐槽了。。。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   938 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 20:35 · PVG 04:35 · LAX 12:35 · JFK 15:35
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.