---
tags: C, pointer
---
C語言的指標範例
===
+ [執行程式](https://repl.it/join/vqtdrrju-aidanlu)
___
### Case#1
```c=
#include <stdio.h>
#include <stlib.h>
int main()
{
int* a = malloc(sizeof(int));
*a = 10;
printf("*a = %d\n", *a);
}
```
:::spoiler 結果
:::success
> *a = 10[color=green]
:::
### Case#2
```c=
#include <stdio.h>
#include <stdlib.h>
int main()
{
int* a[3];
*a[0] = 10;
printf("*a[0] = %d\n*a[1] = %d\n*a[2] = %d\n", *a[0], *a[1], *a[2]);
}
```
:::spoiler 結果
:::danger
可通過編譯,但是<font color="#00f">**執行時會錯誤</font>**
:::
### Case#3
```c=
#include <stdio.h>
#include <stdlib.h>
int main()
{
int* a[3];
int a0 = 10;
int a1 = 20;
int a2 = 30;
a[0] = &a0;
a[1] = &a1;
a[2] = &a2;
printf("*a[0] = %d\n*a[1] = %d\n*a[2] = %d\n", *a[0], *a[1], *a[2]);
}
```
:::spoiler 結果
:::success
> *a[0] = 10[color=green]
*a[1] = 20
*a[2] = 30
:::
### Case#4
```c=
#include <stdio.h>
#include <stdlib.h>
int main()
{
int* a[3];
for (int i = 0; i < 3; i++)
{
a[i] = malloc(sizeof(int));
}
*a[0] = 10;
*a[1] = 20;
*a[2] = 30;
printf("*a[0] = %d\n*a[1] = %d\n*a[2] = %d\n\n", *a[0], *a[1], *a[2]);
a[0][0] = 100;
a[1][0] = 200;
a[2][0] = 300;
printf("a[0][0] = %d\na[1][0] = %d\na[2][0] = %d\n\n", a[0][0], a[1][0], a[2][0]);
a[0][0] = 1000;
a[0][1] = 2000;
a[1][2] = 3000;
printf("a[0][0] = %d\na[0][1] = %d\na[0][1] = %d\n", a[0][1], a[0][1], a[1][2]);
}
```
:::spoiler 結果
:::success
> *a[0] = 10[color=green]
> *a[1] = 20
> *a[2] = 30
>
> a[0][0] = 100
> a[1][0] = 200
> a[2][0] = 300
>
> a[0][0] = 2000
> a[0][1] = 2000
> a[0][1] = 3000
:::
### Case#5
```c=
#include <stdio.h>
#include <stdlib.h>
int main()
{
int a = 10;
int* b = &a;
int** c = &b;
printf("Dump Value :\n");
printf("a = %d, *b = %d, **c = %d\n", a, *b, **c);
**c = 100;
printf("a = %d, *b = %d, **c = %d\n", a, *b, **c);
printf("Dump Address :\n");
printf("&a = 0x%X\n", (int)&a);
printf("&b = 0x%X, b = 0x%X\n", (int)&b, (int)b);
printf("&c = 0x%X, c = 0x%X, *c = 0x%X\n", (int)&c, (int)c, (int)*c);
}
```
:::spoiler 結果

:::success
> Dump Value :
a = 10, *b = 10, **c = 10
a = 100, *b = 100, **c = 100
Dump Address :
&a = 0xC2FDFC
&b = 0xC2FDF0, b = 0xC2FDFC
&c = 0xC2FDE4, c = 0xC2FDF0, *c = 0xC2FDFC[color=green]
:::
### Case#6
```c=
#include <stdio.h>
#include <stdlib.h>
int main()
{
int* b = malloc(sizeof(int));
int** c = &b;
printf("Dump Value :\n");
*b = 10;
printf("*b = %d, **c = %d\n", *b, **c);
**c = 100;
printf("*b = %d, **c = %d\n", *b, **c);
printf("Dump Address :\n");
printf("&b = 0x%X, b = 0x%X\n", (int)&b, (int)b);
printf("&c = 0x%X, c = 0x%X, *c = 0x%X\n", (int)&c, (int)c, (int)*c);
}
```
:::spoiler 結果

:::success
> Dump Value :
*b = 10, **c = 10
*b = 100, **c = 100
Dump Address :
&b = 0x6FF80C, b = 0x8A4F68
&c = 0x6FF800, c = 0x6FF80C, *c = 0x8A4F68[color=green]
:::
### Case#7
```c=
#include <stdio.h>
#include <stdlib.h>
int main()
{
int a = 0x12345678;
unsigned char* b = (unsigned char*)&a;
printf("Dump Value :\n");
printf("a = 0x%X, b[0] = 0x%X, b[1] = 0x%X, b[2] = 0x%X, b[3] = 0x%X\n", a, b[0], b[1], b[2], b[3]);
b[3] = 0x87; b[2] = 0x65; b[1] = 0x43; b[0] = 0x21;
printf("a = 0x%X, b[0] = 0x%X, b[1] = 0x%X, b[2] = 0x%X, b[3] = 0x%X\n", a, b[0], b[1], b[2], b[3]);
printf("Dump Address :\n");
printf("&a = 0x%X, &b = 0x%X, b = 0x%X\n", (int)&a, (int)&b, (int)b);
printf("&b[0] = 0x%X, &b[1] = 0x%X, &b[2] = 0x%X, &b[3] = 0x%X\n", (int)&b[0], (int)&b[1], (int)&b[2], (int)&b[3]);
}
```
:::spoiler 結果

:::success
> Dump Value :
a = 0x12345678, b[0] = 0x78, b[1] = 0x56, b[2] = 0x34, b[3] = 0x12
a = 0x87654321, b[0] = 0x21, b[1] = 0x43, b[2] = 0x65, b[3] = 0x87
Dump Address :
&a = 0x19FA70, &b = 0x19FA64, b = 0x19FA70
&b[0] = 0x19FA70, &b[1] = 0x19FA71, &b[2] = 0x19FA72, &b[3] = 0x19FA73 [color=green]
:::
### Case#8
```c=
#include <stdio.h>
#include <stdlib.h>
int main()
{
int* a;
unsigned char b[] = {0x12, 0x34, 0x56, 0x78};
a = (int*)b;
printf("Dump Value :\n");
printf("a = 0x%X, b[0] = 0x%X, b[1] = 0x%X, b[2] = 0x%X, b[3] = 0x%X\n", (int)a, b[0], b[1], b[2], b[3]);
b[3] = 0x87; b[2] = 0x65; b[1] = 0x43; b[0] = 0x21;
printf("a = 0x%X, b[0] = 0x%X, b[1] = 0x%X, b[2] = 0x%X, b[3] = 0x%X\n", (int)a, b[0], b[1], b[2], b[3]);
printf("Dump Address :\n");
printf("&a = 0x%X\n", (int)&a);
printf("&b[0] = 0x%X, &b[1] = 0x%X, &b[2] = 0x%X, &b[3] = 0x%X\n", (int)&b[0], (int)&b[1], (int)&b[2], (int)&b[3]);
}
```
:::spoiler 結果

:::success
> Dump Value :[color=green]
a = 0x12345678, b[0] = 0x78, b[1] = 0x56, b[2] = 0x34, b[3] = 0x12
a = 0x87654321, b[0] = 0x21, b[1] = 0x43, b[2] = 0x65, b[3] = 0x87
Dump Address :
&a = 0xE2E0C84C
&b[0] = 0xE2E0C84C, &b[1] = 0xE2E0C84D, &b[2] = 0xE2E0C84E, &b[3] = 0xE2E0C84F
:::