培訓學習C已經過了兩三年了,當初指針是簡單的講了一下,內存管理講都沒有講.
幾年的工作下來,感覺基礎越來越重要,對編程思想理解深度很有幫助.
看<C Primer Plus>,寫了一段小代碼來驗證自己的對指針的理解是否正確
環境: gcc version 4.4.5 (Debian 4.4.5-8)
C代碼
#include <stdio.h>
void s(int *i, int *j); //交換地址
void s2(int *i, int *j); //修改內存地址指向區塊的值
void p(int i,int j); //打印值
void pp(int *i, int *j); //打印地址
int main (int argc, char const* argv[])
{
int i = 0,j = 1;
p(i,j);
pp(&i, &j);
s(&i,&j);
p(i,j); //值不變,i j的地址不變, 為什麼不變,據我現在的理解,通過指針傳過去的,能改變的只是指針所指向的內存區域,想改變指針變量的地址,我想只能在i j的本地變量的作用域內通過等號賦值的方式
pp(&i, &j);
s2(&i, &j);
p(i,j);
pp(&i, &j); //值變, i j 的地址不變
return 0;
}
void s(int *i, int *j)
{
int tmp;
tmp = *i;
i = j;
j = &tmp;
printf("address change\n");
p(*i,*j);
pp(i, j);
}
void s2 (int *i, int *j)
{
int tmp;
tmp = *i;
*i = *j;
*j = tmp;
}
void p (int i, int j)
{
printf("%d -- %d \n", i, j);
}
void pp (int *i, int *j)
{
printf("%p -- %p \n", i, j);
}
運行結果:
引用
0 -- 1
0xbfe2fccc -- 0xbfe2fcc8
address change
1 -- 0
0xbfe2fcc8 -- 0xbfe2fc9c
0 -- 1
0xbfe2fccc -- 0xbfe2fcc8
1 -- 0
0xbfe2fccc -- 0xbfe2fcc8
作者“ManGege's Blog”