變量類型 *變量名;
#include <stdio.h> int main() { // 指針就一個作用:能夠根據一個地址值,訪問對應的存儲空間 // 指針變量p前面的int:指針變量p只能指向int類型的數據 int *p; // 定義了一個指針變量p
int a = 90; p = &a; // 指針變量p指向了變量a 指針變量只能存儲地址
*p = 10; //這裡的*與定義指針變量時的*不同,它表示訪問對應的存儲空間 a = 20; printf("%d\n", *p); return 0; }
/* %d int %f float\double %ld long %lld long long %c char %s 字符串 %zd unsigned long */ #include <stdio.h> int main() { char *cp; int *ap; long *bp; printf("cp=%zd, ap=%zd, bp=%zd\n", sizeof(cp), sizeof(ap), sizeof(bp));
// 任何指針都占用8個字節的存儲空間 64位編譯器 思考下為什麼指針要分類型 (計算機根據指針的類型來確認從內存中取多少個字節的內容) }
//根據指針 在函數內部修改外部的變量 #include <stdio.h> void change(int *p); int main() { int a =10; change(&a); printf("a=%d\n",a); return 0; } void change(int *p) { *p = 20; }
//利用指針讓函數間接的有多個返回值 #include <stdio.h> int main() { int a = 15; int b = 10; int he=0,cha=0; test(a,b,&he,&cha); printf("和是%d,差是%d",he,cha); } void test(int a,int b,int *c,int *d) { *c = a+b; *d = a-b; }
#include <stdio.h> /* 1.數組元素的訪問方式 int ages[5]; int *p; p = ages; 1> 數組名[下標] ages[i] 2> 指針變量名[下標] p[i] 3> *(p + i) //指針的+1並不是值加一 2.指針變量+1,地址值究竟加多少,取決於指針的類型 int * 4 char * 1 double * 8 */ void change(int array[]); int main() { // 20個字節 int ages[5] = {10, 11, 19, 78, 67}; change(ages); return 0; } // 利用一個指針來接收一個數組,指針變量array指向了數組的首元素 void change(int *array) { printf("%d\n", array[2]); //printf("%d\n", *(array+2)); } /* void change(int array[]) { int s = sizeof(array); printf("%d\n", s); }*/ void test() { double d = 10.8; double *dp; dp = &d; printf("dp = %p\n", dp); printf("dp + 1 = %p\n", dp + 1); int ages[5] = {10, 9, 8, 67, 56}; int *p; // 指針變量p指向了數組的首元素 p = &ages[0]; // 數組名就是數組的地址,也是數組首元素的地址 //p = ages; /* p ---> &ages[0] p + 1 ---> &ages[1] p + 2 ---> &ages[2] p + i ---> &ages[i] */ //printf("%d\n", *(p+2)); printf("%d\n", p[2]); /* for (int i = 0; i<5; i++) { printf("ages[%d] = %d\n", i, *(p+i)); }*/ // printf("%p\n", p); // printf("%p\n", p + 1); // printf("%p\n", p + 2); }
#include <stdio.h> /* 1.常量區 存放一些常量字符串 2.堆 對象 3.棧 存放局部變量 掌握: 定義字符串的2種方式 1> 利用數組 char name[] = "itcast"; // 字符串變量 * 特點:字符串裡面的字符是可以修改的 * 使用場合:字符串的內容需要經常修改 //char name[] = "it"; //name[0] = 'T'; //printf("%s\n", name); // "it" == 'i' + 't' + '\0' 2> 利用指針 char *name = "itcast"; // 字符串常量 * 特點:字符串其實是一個常量字符串,裡面的字符是不能修改 * 使用場合:字符串的內容不需要修改,而且這個字符串經常使用,它被緩存起來,新定義指針是不在開內存空間的 // char *name2 = "it"; //char *name3 = "it"; //*name2 = 'T'; //程序會崩潰 它是常量不能修改 //printf("%c\n", *name2); // 指針變量name2指向了字符串的首字符 printf("%p\n%p\n", name2, name3); //不開新空間 地址相同 //printf("%s\n", name2); //直到遇到\0 */ int main() { char name[20]; printf("請輸入姓名:\n"); scanf("%s", name); // 'j' 'a' 'c' 'k' '\0' //printf("%c\n", name[3]); //printf("剛才輸入的字符串是:%s\n", name); return 0; } // 定義字符串數組 void test2() { char *name = "jack"; //int ages[5]; // 指針數組(字符串數組) char *names[5] = {"jack", "rose", "jake"}; // 二維字符數組(字符串數組) char names2[2][10] = {"jack", "rose"}; }