IT課程-疑問集合 #c programming func
本帖最后由 meesim1088 于 17-3-2021 10:42 PM 编辑我現在在OUM念IT課程第二年。
沒有相關工作經驗的背景下,念得有點吃力。不過我會堅持不懈的!
記錄科目+遇到的種種疑問。
1. C Programming - 2#, 3#,12#
2. Data Structure
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 于 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。
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: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: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: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: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
flashang 发表于 8-3-2021 09:13 AM
需要使用 [ code ] 内容 [ /code ]
* [ 里面没有空格 ]
测试
明白,多谢纠正,很少用cari,更少放codes,正确来讲,第一次,也有点懒,哈哈,就拿round bracket当square bracket,楼主的codes也是被filtered,他应该明白呱:P
本帖最后由 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
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: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 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]