程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 復習C語言中的指針

復習C語言中的指針

編輯:關於C語言

培訓學習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”
 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved