佳礼资讯网

 找回密码
 注册

ADVERTISEMENT

查看: 955|回复: 12

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

[复制链接]
发表于 7-3-2021 05:36 PM | 显示全部楼层 |阅读模式
本帖最后由 meesim1088 于 17-3-2021 10:42 PM 编辑

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

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

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

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





回复

使用道具 举报


ADVERTISEMENT

 楼主| 发表于 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?
回复

使用道具 举报

 楼主| 发表于 7-3-2021 06:09 PM | 显示全部楼层
本帖最后由 meesim1088 于 8-3-2021 11:08 PM 编辑

Pointers & Arrays

#include <stdio.h>
int main()
{   
int x[4];   
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。





回复

使用道具 举报

发表于 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


评分

参与人数 1人气 +5 收起 理由
meesim1088 + 5 谢谢分享

查看全部评分

回复

使用道具 举报

发表于 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[4];   
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


回复

使用道具 举报

发表于 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)改一改,你应该明白

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

回复

使用道具 举报

Follow Us
发表于 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


  1. &x[i]
  2. 整行就变成

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

复制代码


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



回复

使用道具 举报

发表于 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 ]
* [ 里面没有空格 ]

测试

  1. () - _ : ; / [] "" ~ ''
复制代码




评分

参与人数 1人气 +5 收起 理由
zakuro26 + 5 谢谢分享

查看全部评分

回复

使用道具 举报


ADVERTISEMENT

发表于 8-3-2021 10:47 PM | 显示全部楼层
flashang 发表于 8-3-2021 09:13 AM
需要使用 [ code ] 内容 [ /code ]
* [ 里面没有空格 ]

测试

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

评分

参与人数 2人气 +10 收起 理由
flashang + 5 谢谢分享
meesim1088 + 5 我很赞同

查看全部评分

回复

使用道具 举报

 楼主| 发表于 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[0] 等於 x
回复

使用道具 举报

发表于 11-3-2021 04:46 AM | 显示全部楼层
meesim1088 发表于 8-3-2021 11:19 PM
我納悶, 爲什麽第二個printf不是


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

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

我找到答案了。&x[0] 等於 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

评分

参与人数 1人气 +5 收起 理由
meesim1088 + 5 谢谢分享

查看全部评分

回复

使用道具 举报

 楼主| 发表于 17-3-2021 10:40 PM | 显示全部楼层
本帖最后由 meesim1088 于 17-3-2021 10:42 PM 编辑

十萬個爲什麽

Pointer

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




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

使用道具 举报

发表于 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:


  1. #include <stdio.h>

  2. int main()
  3. {
  4.     int* p;
  5.     int** pp;

  6.     int a = 100;
  7.     p = &a;
  8.     pp = &p;
  9.    
  10.     **pp = 50;
  11.    
  12.     printf("a value: %d\n", a);
  13.     printf("p value: %d\n", *p);
  14.     printf("pp value: %d\n", **pp);
  15.    
  16.     *p = 60;
  17.    
  18.     printf("a value: %d\n", a);
  19.     printf("p value: %d\n", *p);
  20.     printf("pp value: %d\n", **pp);

  21.     a = 70;
  22.    
  23.     printf("a value: %d\n", a);
  24.     printf("p value: %d\n", *p);
  25.     printf("pp value: %d\n", **pp);

  26.     int b = 200;
  27.     p = &b;
  28.    
  29.     printf("a value: %d\n", a);
  30.     printf("b value: %d\n", b);
  31.     printf("p value: %d\n", *p);
  32.     printf("pp value: %d\n", **pp);

  33.     int c = 300;
  34.     *pp = &c;
  35.    
  36.     printf("a value: %d\n", a);
  37.     printf("b value: %d\n", b);
  38.     printf("c value: %d\n", c);
  39.     printf("p value: %d\n", *p);
  40.     printf("pp value: %d\n", **pp);

  41.     return 0;
  42. }
复制代码



评分

参与人数 1人气 +5 收起 理由
meesim1088 + 5

查看全部评分

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

 

ADVERTISEMENT



ADVERTISEMENT



ADVERTISEMENT

ADVERTISEMENT


版权所有 © 1996-2023 Cari Internet Sdn Bhd (483575-W)|IPSERVERONE 提供云主机|广告刊登|关于我们|私隐权|免控|投诉|联络|脸书|佳礼资讯网

GMT+8, 19-4-2024 10:18 AM , Processed in 0.060458 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表