標籤:
記憶體的訪問形式:1、直接存取:通過變數名進行訪問。2、間接訪問:先找到變數存放的地址,然後根據地址去訪問對應的記憶體空間。
指標---
// 定義一個整形指標變數,用來儲存num1在記憶體中的地址
int *p = NULL; // 定義一個整形指標變數,指向0x0,NULL恒等於0
printf("%p\n", p); // 輸出指標變數的值,使用"%p"
printf("&num1 = %p\n", &num1); // 取址運算子,取得變數所在的記憶體位址
p = &num1; // 給整形指標變數重新賦值
printf("p = %p\n", p);
printf("*p = %d\n", *p); // "*"取值運算子,取出地址裡面儲存的資料
// 當我們定義指標變數的時候,"*"只是起一個標識作用,告訴我們這個變數是一個指標變數。
// 當我們使用指標變數的時候,"*"表示的是從當前地址裡面取出儲存的資料。
// 指標的算術運算,只有加和減
int num1 = 100;
int num2 = 200;
int *p = &num2;
printf("*p = %d\n", *p);
printf("*(p + 1) = %d\n", *(p + 1)); // p + 1是指標向高位移動n個位元組,n指的是指標指向的資料類型所佔有的位元組數(int *p移動4個位元組, char *p1移動1個位元組)
printf("&num1 = %p\n", &num1);
printf("&num2 = %p\n", &num2);
printf("p = %p\n", p);
printf("p + 1 = %p\n", p + 1);
printf("p - 1 = %p\n", p - 1); // p - 1是指標向低位移動n個位元組,n指的是指標指向的資料類型所佔有的位元組數(int *p移動4個位元組, char *p1移動1個位元組)
printf("++p = %p\n", ++p);
// 指標和數組
int array[3] = {1, 3, 5};
printf("array = %p\n", array); // 數組名就是數組元素的首地址
printf("&array[0] = %p\n", &array[0]);
int *p = array;
printf("%d\n", *p);
printf("%d\n", *(p + 1));
printf("%d\n", *p + 1);
*(p + 2) = 6;
p[1] = 10; // 指標可以當做數組名來使用
// 指標和數組的區別:所佔空間不同:指標所佔的空間只喝作業系統有關,數組佔用的空間等於數組的元素個數*數組元素類型所佔的位元組數。
// 數組名是常量地址,不能重指向。指標可以進行重指向。
int *p1 = NULL;
// array = p1;
p = p1;
// 指標和字串
char str[10] = "iPhone"; // 把常量區的字串"iPhone"拷貝到了棧區,所以可以變更
char *p = str;
printf("%s\n", str);
printf("%s\n", p);
*(p + 1) = ‘X‘; // 使用字元指標操作單個字元
printf("%s\n", p); // 使用字元指標操作字串
printf("%c\n", p[3]);
printf("%c\n", *(p + 3));
printf("%s\n", p + 2);
char *str1 = "iPhone"; // 棧區的指標str1指向常量區的某一塊地區
printf("str1 = %s\n", str1);
// *(str1 + 1) = ‘X‘; // 常量不能修改
printf("str = %p\n", str);
printf("str1 = %p\n", str1);
// 指標數組
char *strings[3] = {"iOS", "iMac", "iPad"};
printf("%s\n", *strings); // 取出數組中的第一個元素(數組裡面的元素是地址)
printf("%s\n", *(strings + 1));
printf("%s\n", *(strings + 2));
printf("%c\n", *(*strings));
printf("%c\n", *(*strings + 1));
printf("\n\n");
printf("%p\n", strings);
printf("%p\n", strings + 1);
printf("%p\n", strings + 2);
C語言 ---- 指標 iOS學習-----細碎知識點總結