2023年1月26日 星期四
java Native 調用 C
2023年1月9日 星期一
C語言指針
※基本型態指針
// 包括 short int long float double chat
#include <stdio.h>
void test(int *d) {
*d = 100; // 將 d 這個位址對應的值,改成 100; 寫 d 或 &d 都會報錯
}
int main() {
int digit = 2;
test(&digit);
printf("digit=%d", digit);
return 0;
}
※在變數前加上 &,表示傳的是記憶體位址;
在變數前加上 *,表示接收記憶體位址
所以可以這樣宣告變數 int *x = &digit; test(x);
※這樣的好處是方法裡改變的值,會影響調用方的值
※只有傳的時候給 &,接收時給 * 才不會報錯,其他都會報錯
※陣列指針
#include <stdio.h>
int main() {
int arr[] = {1, 2, 3};
// 注意是用 int *p 來接,不是 int[]*p,會報錯
int *p = arr; // 指向的是 arr[0]的記憶體位址,陣列不可打 &arr,因為它有多個值,要傳其中一個值可用 &arr[0],但代表整體就不能有 &,會報錯
// 以下三個結果一樣
printf("%p\n", &arr[0]);
printf("%p\n", arr);
printf("%p\n", p);
// 以下三個結果一樣,和上面差 4,也就是 4 Bytes
printf("%p\n", &arr[1]);
printf("%p\n", arr + 1);
printf("%p\n", p + 1);
// 以下三個結果都是 2,也就是取值
printf("%d\n", *(&arr[1]));
printf("%d\n", *(arr + 1));
printf("%d\n", *(p + 1));
printf("%p\n", &arr + 1); // &arr 是整個 arr 的記憶體位址,如果佔用 4Bytes,結果將是 4Bytes 結束再 + 1,可用 sizeof() 查看佔多少 Byte
return 0;
}
※字串指針
int main() {
char *p = "a";
printf("string=%s", p);
// int *i = 9;
// printf("digit=%d", i);
return 0;
}
※字串指針可以直接賦值,其他不行
※陣列裡放指針
int main() {
char *s1 = "ab";
char *s2 = "cd";
char *s3 = "ef";
char *s[3] = {s1, s2, s3}; // 和陣列就差一個 *,只有字串可以這樣寫
printf("string=%p\n", s);
printf("%s", s[1]);
return 0;
}