meesim1088 发表于 7-3-2021 05:36 PM

IT課程-疑問集合 #c programming func

本帖最后由 meesim1088 于 17-3-2021 10:42 PM 编辑

我現在在OUM念IT課程第二年。

沒有相關工作經驗的背景下,念得有點吃力。不過我會堅持不懈的!

記錄科目+遇到的種種疑問。

1. C Programming - 2#, 3#,12#
2. Data Structure





meesim1088 发表于 7-3-2021 05:53 PM

C programming - function

#include <stdio.h>
int x, y;

void f1 (void)
{
int x;
x = 0;
y = 0;
}

int main ()
{
x = 10;
y = 15;
f1 ();
printf("x = %d, y = %d\n", x, y);
}



Output:
x = 10, y = 0;


1. 爲什麽declare了global int x, function裏面還要declare多一次?
2. 爲什麽output y的value是拿function裏面y value?

meesim1088 发表于 7-3-2021 06:09 PM

本帖最后由 meesim1088 于 8-3-2021 11:08 PM 编辑

Pointers & Arrays

#include <stdio.h>
int main()
{   
int x;   
int i;   
for(i = 0; i < 4; ++i)
{      
printf("&x[%d] = %p\n", i, &x [ i ] );   
}   

printf("Address of array x: %p", x);   
return 0;
}

1. 爲什麽第二個printf 沒有使用&x?
2. 我時常搞不清楚i++和++i。





zakuro26 发表于 7-3-2021 10:09 PM

meesim1088 发表于 7-3-2021 05:53 PM
C programming - function

#include
int x, y;

void f1 (void)
{
int x;
x = 0;
y = 0;
}

int main ()
{
x = 10;
y = 15;
f1 ();
printf("x = %d, y = %d\n", x, y);
}



Output:
x = 1 ...

问题1,如果你问为什么,我想你的lecturer, tutor, textboook要你明白c里头的scope定义吧,f1()里的x不是global x,不会改global x的value,试下以下的codes,你会比较明白:

#include <stdio.h>

int x, y;

void f1 ()
{
    int x;
    x = 0;
    y = 0;
   
    printf("x = %d, y = %d\n", x, y);
}

int main()
{
    x = 10;
    y = 15;
   
    f1();

    printf("x = %d, y = %d\n", x, y);

    return 0;
}

问题2,global y的value在f1()里被改了,所以在main()的printf()显示value = 0


zakuro26 发表于 7-3-2021 10:29 PM

本帖最后由 zakuro26 于 7-3-2021 10:31 PM 编辑

meesim1088 发表于 7-3-2021 06:09 PM
Pointers & Arrays

#include
int main()
{   
int x;   
int i;   
for(i = 0; i < 4; ++i)
{      
printf("&x[%d] = %p\n", i, &x);   
}   

printf("Address of array x: %p", x);   
retur ...
问题1,我想你的codes应该少了点东西,loop里头应该是:
for (i = 0; i < 4; ++i)
{
      printf("&x[%d] = %p\n", i, &x);   
}

loop里头是print每一个element(for array)的pointer address,最后的printf()显示array的pointer address,也就是第一个element的pointer address

问题2,那是pre-increment和post-increment,看这个link:
https://stackoverflow.com/questi ... nce-between-i-and-i
一般情况下会prefer++i


zakuro26 发表于 7-3-2021 10:35 PM

本帖最后由 zakuro26 于 7-3-2021 10:39 PM 编辑

zakuro26 发表于 7-3-2021 10:29 PM
问题1,我想你的codes应该少了点东西,loop里头应该是:
for (i = 0; i < 4; ++i)
{
      printf("&x[%d] = %p\n", i, &x);   
}

loop里头是print每一个element(for array)的pointer address,最后的print ...
回你时有typo,把x(i)改一改,你应该明白:P

问题1,我想你的codes应该少了点东西,loop里头应该是:
for (i = 0; i < 4; ++i)
{
      printf("&x[%d] = %p\n", i, &x(i));   
}

flashang 发表于 8-3-2021 09:03 AM

本帖最后由 flashang 于 8-3-2021 09:09 AM 编辑

zakuro26 发表于 7-3-2021 10:35 PM
回你时有typo,把x(i)改一改,你应该明白

问题1,我想你的codes应该少了点东西,loop里头应该是:
for (i = 0; i < 4; ++i)
{
      printf("&x[%d] = %p\n", i, &x(i));   
}

应该是 square bracket


&x
整行就变成

printf ( "&x[%d] = %p \n", i, &x );



另外,可以加一些空格,比较好阅读。

:L

flashang 发表于 8-3-2021 09:13 AM

本帖最后由 flashang 于 8-3-2021 09:15 AM 编辑

zakuro26 发表于 7-3-2021 10:29 PM
问题1,我想你的codes应该少了点东西,loop里头应该是:
for (i = 0; i < 4; ++i)
{
      printf("&x[%d] = %p\n", i, &x);   
}

loop里头是print每一个element(for array)的pointer address,最后的print ...

需要使用 [ code ] 内容 [ /code ]
* [ 里面没有空格 ]

测试

() - _ : ; / [] "" ~ ''


:L

zakuro26 发表于 8-3-2021 10:47 PM

flashang 发表于 8-3-2021 09:13 AM
需要使用 [ code ] 内容 [ /code ]
* [ 里面没有空格 ]

测试

明白,多谢纠正,很少用cari,更少放codes,正确来讲,第一次,也有点懒,哈哈,就拿round bracket当square bracket,楼主的codes也是被filtered,他应该明白呱:P

meesim1088 发表于 8-3-2021 11:19 PM

本帖最后由 meesim1088 于 9-3-2021 12:46 AM 编辑

zakuro26 发表于 7-3-2021 10:29 PM
问题1,我想你的codes应该少了点东西,loop里头应该是:
for (i = 0; i < 4; ++i)
{
      printf("&x[%d] = %p\n", i, &x);   
}

loop里头是print每一个element(for array)的pointer address,最后的print ...
最后的printf()显示array的pointer address,也就是第一个element的pointer address
我納悶, 爲什麽第二個printf不是


printf("Address of array x: %p", &x);

%p不是要跟&這個sign一起用嗎?

我找到答案了。&x 等於 x

zakuro26 发表于 11-3-2021 04:46 AM

meesim1088 发表于 8-3-2021 11:19 PM
我納悶, 爲什麽第二個printf不是


printf("Address of array x: %p", &x);

%p不是要跟&這個sign一起用嗎?

我找到答案了。&x 等於 x

因为x是array,array是pointer variable,x的elements是int type,x [ i ] 读取 value,不是address,如果要print address,你需要&x,不然只放x就是print value,会有compile error地,array本身是pointer variable,也是point to第一个element,所以第二个printf()就用x

meesim1088 发表于 17-3-2021 10:40 PM

本帖最后由 meesim1088 于 17-3-2021 10:42 PM 编辑

十萬個爲什麽

Pointer

1. 什麽是pointer?
2. Pointer的作用是什麽?


https://uf.cari.com.my/forumx/cforum/album/202103/17/223513wkc1q89yyq89luc9.jpg

3. 爲什麽pointer還有它的pointer? int **pp;

zakuro26 发表于 19-3-2021 12:56 AM

本帖最后由 zakuro26 于 19-3-2021 01:03 AM 编辑

meesim1088 发表于 17-3-2021 10:40 PM
十萬個爲什麽

Pointer

1. 什麽是pointer?
2. Pointer的作用是什麽?




3. 爲什麽pointer還有它的pointer? int **pp;
回你第一和第二问题,参考这个link,第一个paragraph就回答你的问题:
https://www.guru99.com/c-pointers.html
顺便给个建议,不用太纠结在完美的答案,或太过在pointer上钻牛角间,以后你看的例子多后,或对各种hardware,processors更了解,会自然更明白

问题三,pointer to pointer在c和c++是正常和惯用地,原因可以很多,easy to manage(如果readable) blah blah,就用你的fig3.3为例子,both p和pp,都会给你相同的value,也就是a的value,因为p point to a,pp point to p(p point to a,所以会给你a的value),用个比较简白的例子,say p 是我的bank account,pp 是我的老婆的bank account,我们是联名account(a),无论想读取我或我的老婆的account,都因该给a的value,可以试跑以下的codes,希望能帮你更了解pointer to pointer:


#include <stdio.h>

int main()
{
    int* p;
    int** pp;

    int a = 100;
    p = &a;
    pp = &p;
   
    **pp = 50;
   
    printf("a value: %d\n", a);
    printf("p value: %d\n", *p);
    printf("pp value: %d\n", **pp);
   
    *p = 60;
   
    printf("a value: %d\n", a);
    printf("p value: %d\n", *p);
    printf("pp value: %d\n", **pp);

    a = 70;
   
    printf("a value: %d\n", a);
    printf("p value: %d\n", *p);
    printf("pp value: %d\n", **pp);

    int b = 200;
    p = &b;
   
    printf("a value: %d\n", a);
    printf("b value: %d\n", b);
    printf("p value: %d\n", *p);
    printf("pp value: %d\n", **pp);

    int c = 300;
    *pp = &c;
   
    printf("a value: %d\n", a);
    printf("b value: %d\n", b);
    printf("c value: %d\n", c);
    printf("p value: %d\n", *p);
    printf("pp value: %d\n", **pp);

    return 0;
}



页: [1]
查看完整版本: IT課程-疑問集合 #c programming func


ADVERTISEMENT