星期二, 6月 16, 2009

20090616 C語言進階上課小記

*****************************20090616 陳惠堂*********************************************

指標 pointer
  • 裡面擺放的是位址, 不是擺放值
  • 通常對付 大傢伙
  • int *p;

*new 配置記憶體位址
語法
new 型別
new int;

傳送的方式
  • Call By Value 傳值
    • 只是換值(資料), 不是位址
  • Call By Reference 傳參考
    • 參考的是位址
    • 放在接的地方,(例如 Function 內)
  • Call By Address 傳址
    • 直接給位址



Lab: Call by Value
// include 引入 .h (標頭檔)
// header .h 要放在程式的最前面
// 引入 stdio.h 及 stdlib.h
#include "stdio.h"
#include "stdlib.h"

//進入主程式
int main()
{


int x,y;
//宣告 swap, 因為寫在 main的後面 所以要先宣告
void swap(int a, int b);
x=5;
y=7;
printf("Before swap\n");
printf("x=%d\ty=%d\n\n",x,y);
//呼叫 swap 將兩個互相調換
printf("Call swap\n");
swap(x,y);
printf("After swap\n");
printf("x=%d\ty=%d\n",x,y);


//執行系統內的 pause指令 暫停 宣告被寫在 stdlib.h 內

system("pause");

return 0;
}


//使用swap function 來互相調換
void swap(int a,int b)
{
int t;
t = a;
a = b;
b = t;
printf("a=%d\tb=%d\n\n",a,b);
}




Lab: Call by Reference
// include 引入 .h (標頭檔)
// header .h 要放在程式的最前面
// 引入 stdio.h 及 stdlib.h
#include "stdio.h"
#include "stdlib.h"

//進入主程式
int main()
{


int x,y;
//宣告 swap, 因為寫在 main的後面 所以要先宣告
//宣告時使用 &a &b 所以是 Call by Reference 要的是位址
void swap(int &a, int &b);
x=5;
y=7;
printf("Before swap\n");
printf("x=%d\ty=%d\n\n",x,y);
//呼叫 swap 將兩個互相調換
printf("Call swap\n");
swap(x,y);
printf("After swap\n");
printf("x=%d\ty=%d\n",x,y);


//執行系統內的 pause指令 暫停 宣告被寫在 stdlib.h 內

system("pause");

return 0;
}


//使用swap function 來互相調換
// 使用 &a &b 使用 Call by Reference
void swap(int &a,int &b)
{
int t;
t = a;
a = b;
b = t;
printf("a=%d\tb=%d\n\n",a,b);
}



Lab: Call By Address
// include 引入 .h (標頭檔)
// header .h 要放在程式的最前面
// 引入 stdio.h 及 stdlib.h
#include "stdio.h"
#include "stdlib.h"

//進入主程式
int main()
{


int x,y;
//宣告 swap, 因為寫在 main的後面 所以要先宣告
void swap(int *a, int *b);
x=5;
y=7;
printf("Before swap\n");
printf("x=%d\ty=%d\n\n",x,y);
//呼叫 swap 將兩個互相調換
printf("Call swap\n");
//告知swap 使用 Call By Address 的方式來處理
swap(&x,&y);
printf("After swap\n");
printf("x=%d\ty=%d\n",x,y);


//執行系統內的 pause指令 暫停 宣告被寫在 stdlib.h 內

system("pause");

return 0;
}


//使用swap function 來互相調換
//使用 指標來 接Call by Address
void swap(int *a,int *b)
{
int t;
t = *a;
*a = *b;
*b = t;
//會印出 a 還有b 的位址 所以不會是 5 and 7
printf("a=%x\tb=%x\n\n",a,b);
}


陣列名稱
  • 本身就是記憶體的位址
  • 第一個陣列的值


Lab:
// include 引入 .h (標頭檔)
// header .h 要放在程式的最前面
// 引入 stdio.h 及 stdlib.h
#include "stdio.h"
#include "stdlib.h"


//宣告 sum 函數
int sum(int *n);

//進入主程式
int main()
{


int n[]={1,2,3,4,5};
//列印出結果
printf("Sum=%d\n",sum(n));


//執行系統內的 pause指令 暫停 宣告被寫在 stdlib.h 內

system("pause");

return 0;
}


// 利用指標的方式 來承接
int sum(int *n)
{
int s=0;
// 利用 for 迴圈將 n陣列的值加總

for(int i=0;i<5;i++)
{
s+=*n++;
}
return s;
}



可以利用 const 宣告為常數(不能修改)



Lab:轉換英文小寫到大寫
// include 引入 .h (標頭檔)
// header .h 要放在程式的最前面
// 引入 stdio.h 及 stdlib.h
#include "stdio.h"
#include "stdlib.h"

void upper(char s[]);


//進入主程式
int main()
{


char str[100];
printf("Enter String:");
gets(str);
upper(str);
printf("Transfer to Upper Case\n");
printf("%s\n",str);


//執行系統內的 pause指令 暫停 宣告被寫在 stdlib.h 內

system("pause");

return 0;
}



void upper(char s[])
{
int i=0;
while( s[i] != '\0')
{
//判斷是不是小寫的 a - z
if( s[i] >= 97 && s[i] <= 122)
s[i]-=32;
i++;
}



Lab:轉換英文小寫到大寫 以指標的方式
// include 引入 .h (標頭檔)
// header .h 要放在程式的最前面
// 引入 stdio.h 及 stdlib.h
#include "stdio.h"
#include "stdlib.h"

void upper(char *);


//進入主程式
int main()
{


char str[100];
printf("Enter String:");
gets(str);
upper(str);
printf("Transfer to Upper Case\n");
printf("%s\n",str);


//執行系統內的 pause指令 暫停 宣告被寫在 stdlib.h 內

system("pause");

return 0;
}



void upper(char *s)
{
int i=0;
while( *s != '\0')
{
//判斷是不是小寫的 a - z
if( *s >= 97 && *s <= 122)
*s -= 32;
s++;
}

沒有留言: