查看: 1322|回复: 12
|
IT課程-疑問集合 #c programming func
[复制链接]
|
|
本帖最后由 meesim1088 于 17-3-2021 10:42 PM 编辑
我現在在OUM念IT課程第二年。
沒有相關工作經驗的背景下,念得有點吃力。不過我會堅持不懈的!
記錄科目+遇到的種種疑問。
1. C Programming - 2#, 3#,12#
2. Data Structure
|
|
|
|
|
|
|
|
楼主 |
发表于 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
|
评分
-
查看全部评分
|
|
|
|
|
|
|
发表于 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));
}
|
|
|
|
|
|
|
|
发表于 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[i]
- 整行就变成
- 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 ]
* [ 里面没有空格 ]
测试
|
评分
-
查看全部评分
|
|
|
|
|
|
|
发表于 8-3-2021 10:47 PM
|
显示全部楼层
明白,多谢纠正,很少用cari,更少放codes,正确来讲,第一次,也有点懒,哈哈,就拿round bracket当square bracket,楼主的codes也是被filtered,他应该明白呱
|
评分
-
查看全部评分
|
|
|
|
|
|
|
楼主 |
发表于 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
|
显示全部楼层
因为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
|
评分
-
查看全部评分
|
|
|
|
|
|
|
楼主 |
发表于 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 编辑
回你第一和第二问题,参考这个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;
- }
复制代码
|
评分
-
查看全部评分
|
|
|
|
|
|
| |
本周最热论坛帖子
|