iT邦幫忙

2017 iT 邦幫忙鐵人賽
DAY 6
0
自我挑戰組

C-Programming系列 第 6

C-Programming - Day06

  • 分享至 

  • xImage
  •  

指標

變數

變數提供了一個有名稱的記憶體位址

當我們宣告 int x = 0

的時候

其實是系統在記憶體當中找一塊 int 大小的空間

記錄下記憶體位址(像是 0x23ff12,每次不一樣)

名稱設為 x

取址運算子

當我們要知道變數的位址的時候

可以使用&來取得

int main(void) {
    int x = 10;
    printf("Value of x : %d\n", x);
    printf("Address of x : %p\n", &x);
    return 0;
}
/**
output:

Value of x : 10
Address of x : 0x23ff12
**/

宣告

type *param

Example:

int *num;
float *num2;
char *str01;

指標也必須宣告 目標 的變數型態

#include <stdio.h>

int main()
{
  int num = 10;
  int *prt = &num;
  printf("The value of address where ptr point : %p\n", prt);
  printf("num The value of num: %d", *prt);
  return 0;
}

提取運算子(Dereference)

上述範例中第二次printf中 *prt 會顯示出指標所指的值

而不是位址

* 稱為提取運算子

特性

#include <stdio.h>

int main()
{
  int x = 10;
  int *ptr = &x;

  printf("The value is %d\n", *ptr);
  *ptr = 20;
  printf("The value is %d\n", *ptr);
  printf("x: %d\n", x);
  return 0;
}
/**
The value is 10
The value is 20
x : 20
**/

也就是代表若是修改指標的值

同時也會修改原本的值

Function 的input 陷阱

之前曾經說過在Function 中修改值

並不會影響傳入的值

#include <stdio.h>

void swap(int x, int y)
{
  int tmp;
  tmp = x;
  x = y;
  y = tmp;
}

int main()
{
  int x = 5, y = 10;
  printf("Before : x = %d, y = %d\n", x, y);
  swap(x, y);
  printf("After : x = %d, y = %d", x, y);
  return 0;
}
/**
Before : x=5, y=10
After : x = 5, y = 10
**/

但是若我們傳入的是指標

#include <stdio.h>

void swap(int *x, int *y)
{
  int tmp;
  tmp = *x;
  *x = *y;
  *y = tmp;
}

int main()
{
  int x = 5, y = 10;
  printf("Before : x = %d, y = %d\n", x, y);

  //傳記憶體位址進去
  swap(&x, &y);

  printf("After : x = %d, y = %d\n", x, y);
  return 0;
}
/**
Before : x=5, y=10
After : x = 10, y = 5
**/

上一篇
C-Programming - Day05
下一篇
C-Programming - Day07
系列文
C-Programming9
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言