没有更混乱的指针

时间:2015-07-01 14:43:56

标签: c arrays pointers c-strings

以下是我的代码:

func playRemoteFile() {

    let fileUrl = "http://www.foo.com/bar.mp3"
    let url = NSURL(string: fileUrl)

    var myPlayer = AVPlayer(URL: url)
    myPlayer.play()
}

运行上面的代码给出输出:

#include <stdio.h>
int main()
{
     char a[10]="Hi!";  
    void f(char b[])
    {
        // 1. printf("*a is:%s\n",*a);
        printf("&a is:%p\n",&a);
        // 2. printf("&&a is:%p\n",&(&a));
        printf("a's address is:%p\n",a);
        printf("a's value is:%s\n",a);
        printf("b's address is:%p\n",b);
        printf("b's value is:%s\n",b);
        // 3. printf("*b is:%s\n",*b);
        printf("&b is:%s\n",&b);
    }

    f(a);

    return 1;
    getch();
}

在输出中:     为什么&a is:0028FF1C a's address is:0028FF1C a's value is:Hi! b's address is:0028FF1C b's value is:Hi! &b is:∟ ( &a有不同的输出;     虽然a和b有相同的参考。

此外,

我已经通过他们的电话号码提到了3条评论。 如果我逐个删除斜线并执行它们,我会遇到以下两个问题:

  1. 执行评论号。 1&amp; 3:

    &b
  2. 执行评论号。 2:

    "abc.exe has stopped working."
    

4 个答案:

答案 0 :(得分:4)

  • 第1点: Nested functions are not standard C. They are supported as GCC extension.

  • 第2点: string[] A = {"1","2","3","4","5"}; int index = 3; var result = A.Take(index + 1) .Concat(Enumerable.Repeat("", 10 - A.Length)) .Concat(A.Skip(index+1)) .ToArray(); 错误并调用UB,原因是格式说明符不正确。您需要将其更改为

    printf("&b is:%s\n",&b);
  • 第3点: printf("&b is:%p\n",(void *)&b); 错误。 &(&a)的操作数需要是左值,而不是另一个地址,它不是左值。

    相关:&,章节C11,操作数类型

      

    一元§6.5.3.2运算符的操作数应该是函数指示符,&或一元[]运算符的结果,或者是指定不是对象的对象的左值位字段,不使用寄存器存储类说明符声明。

    和返回类型

      

    ....结果不是左值。

答案 1 :(得分:0)

您复制粘贴了printf()并且没有更改说明符

printf("&b is:%s\n", &b)
/*             ^ should be `p' */

第一条注释在执行时会导致问题,因为您正在使用"%s"说明符并传递将被解释为地址的a的第一个字符,请尝试此

printf("*a is: %c\n", *a);

第三条评论提出了同样的问题。

第二条评论,你需要一个中间指针来做这件事,比如

char  *c = &a;
char **d = &c;

printf("%p\n", (void *) d);

虽然它将打印与printf("%p\n", (void *) a);相同,因为它们都具有相同的地址,但不同之处在于指针算法的工作方式不同。

答案 2 :(得分:0)

好吧,你不应该在另一个函数中定义函数 - 虽然有些编译器接受它(比如gcc),但它不可移植。

    printf("&b is:%s\n",&b);

此处&bb的地址,它是char数组的地址。实际上&amp; b是参数的地址。

1。)和3.)失败,因为您需要将指针传递给字符串。 * a,是一个解除引用的指针,因此,实际上,它是字符串的第一个字符

2。)&amp;&amp; a是指向指向指针的指针的指针(因为a 已经是指针。

答案 3 :(得分:0)

注意:这是作者自己的答案,请参阅revision 3

我理解上述问题,这是改进的代码:

    #include<stdio.h>
    #include<string.h>

    int i;


    char a[11]="F*** Yeahh!";  //String : char *

    //'a' gets memory in "globals" area;'a' is a pointer to 'F'

    void func();//Function Definition

    int main()
    {
        func(a);    //Passing reference of 'a' to func
        getch();
        return 1;
    }

    void func(char b[])
        //'b' is given memory in 'stack' region;'b' has a reference
        // to 'a'   which in turn refer to 'F'
    {
        printf("*a is:%c\n",*a);
        printf("&a is:%p\n",&a);

        //printf("&&a is:%p\n",&(&a));//&()...Inside braces,there must be a
        // value..

        printf("a's address is:%p\n",a);
        printf("a's value is:%s\n",a);
        printf("b's address is:%p\n",b);
        printf("b's value is:%s\n",b);
        printf("*b is:%c\n",*b);
        printf("&b is:%p\n",&b);

        for(i=0;i<strlen(a);i++)
            printf("String as an array of characters is:%c\n",b[i]);
    }

这是输出:

*a is:F
&a is:00409000
a's address is:00409000
a's value is:F*** Yeahh!
b's address is:00409000
b's value is:F*** Yeahh!
*b is:F
&b is:0028FF20
String as an array of characters is:F
String as an array of characters is:*
String as an array of characters is:*
String as an array of characters is:*
String as an array of characters is:
String as an array of characters is:Y
String as an array of characters is:e
String as an array of characters is:a
String as an array of characters is:h
String as an array of characters is:h
String as an array of characters is:!