1. 格式:變量類型 *指針變量名;
2. 舉例:int *p; char *p2;
3. 注意:定義變量時的*僅僅是指針變量的象征
1.指向某個變量
int a;
int *p;
p = &a;
或者
int *p = &a;
2.修改所指向變量的值
*p = 10;
3.在函數內部修改外面變量的值
int a = 10;
change(&a);
void change(int *n)
{
*n = 20;
}
1.將數組當做函數參數傳入時,會自動轉為指針
1.定義字符串的2種方式
1> 利用數組
char name[] = "ios";
* 特點:字符串里面的字符是可以修改的
* 使用場合:字符串的內容需要經常修改
2> 利用指針
char *name = "ios";
* 特點:字符串其實是一個常量字符串,里面的字符是不能修改
* 使用場合:字符串的內容不需要修改,而且這個字符串經常使用
2.定義字符串數組
1> 利用二維字符數組
char names[2][10] = {"jack", "rose"};
2> 利用指針數組
char *names[2] = {"jack", "rose"};
1.定義
1 #include <stdio.h> 2 3 void change(int); 4 5 int main() 6 { 7 /* 8 int a = 90; 9 10 change(&a);11 12 13 */14 15 // 變量類型 變量名;16 // 格式:變量類型 *變量名;17 // 定義了一個指針變量p18 // 指針變量只能存儲地址19 // 指針就一個作用:能夠根據一個地址值,訪問對應的存儲空間20 // 指針變量p前面的int:指針變量p只能指向int類型的數據21 int *p;22 23 int a = 90;24 25 // 指針變量p指向了變量a26 p = &a;27 28 *p = 10;29 30 a = 20;31 32 printf("%d/n", *p);33 34 //printf("%d/n", a);35 36 return 0;37 }38 39 void change(int n)40 {41 n = 10;42 }
2.使用注意
1 #include <stdio.h> 2 3 int main() 4 { 5 /* 不建議的寫法, int *p只能指向int類型的數據 6 int *p; 7 double d = 10.0; 8 p = &d;*/ 9 10 /* 指針變量只能存儲地址11 int *p;12 p = 200;13 */14 15 /* 指針變量未經過初始化,不要拿來間接訪問其他存儲空間16 int *p;17 printf("%d/n", *p);18 */19 20 int a = 10;21 /*22 int a;23 a = 10;24 */25 26 /*27 int *p;28 p = &a;29 */30 // 定義變量時的*僅僅是一個象征,沒有其他特殊含義31 int *p = &a;32 33 // 不正確的寫法34 // *p = &a;35 p = &a;36 37 // 這個時候的*的作用:訪問指向變量p指向的存儲空間38 *p = 20;39 40 41 char c = 'A';42 43 char *cp = &c;44 45 *cp = 'D';46 47 printf("%c/n", c);48 49 return 0;50 }
3.指向指針的指針
1 #include <stdio.h> 2 int main() 3 { 4 int a = 10; 5 6 int *p = &a; 7 8 int **pp = &p; 9 10 // a = 20;11 12 // *p = 20;13 14 /*15 (*pp) == p16 17 *(*pp) == *p = a18 19 **pp == *p = a20 */21 **pp = 20;22 23 printf("%d/n", a);24 25 //int ***ppp = &pp;26 27 /*28 char a2 = 'A';29 char *p2 = &a2;30 */31 32 return 0;33 }
4.練習
1 #include <stdio.h> 2 void swap(int *v1, int *v2); 3 4 int main() 5 { 6 /* 7 int a = 10; 8 int b = 11; 9 10 swap(&a, &b);11 */12 13 14 int a2 = 90;15 int b2 = 89;16 17 swap(&a2, &b2);18 19 printf("a2=%d, b2=%d/n", a2, b2);20 return 0;21 }22 23 /* 不能交換外面實參的值,僅僅是交換了內部指針的指向24 void swap(int *v1, int *v2)25 {26 int *temp;27 temp = v1;28 v1 = v2;29 v2 = temp;30 }*/31 32 // 完成兩個整型變量值的互換33 void swap(int *v1, int *v2)34 {35 int temp = *v1;36 *v1 = *v2;37 *v2 = temp;38 }39 40 /* 交換的只是內部v1、v2的值41 void swap(int v1, int v2)42 {43 int temp = v1;44 v1 = v2;45 v2 = temp;46 }*/
1 #include <stdio.h> 2 int sumAndMinus(int n1, int n2, int *n3); 3 4 int main() 5 { 6 int a = 10; 7 int b = 7; 8 9 // 存儲和10 int he;11 // 存儲差12 int cha;13 c14 he = sumAndMinus(a, b, &cha);15 16 printf("和是%d, 差是%d/n", he, cha);17 18 return 0;19 }20 21 // 返回值是22 int sumAndMinus(int n1, int n2, int *n3)23 {24 *n3 = n1 - n2;25 26 return n1 + n2;27 }
5.指針和數組
1 #include <stdio.h> 2 3 /* 4 1.數組元素的訪問方式 5 int ages[5]; 6 int *p; 7 p = ages; 8 1> 數組名[下標] ages[i] 9 2> 指針變量名[下標] p[i]10 3> *(p + i)11 12 2.指針變量+1,地址值究竟加多少,取決于指針的類型13 int * 414 char * 115 double * 816 */17 void change(int array[]);18 19 int main()20 {21 // 20個字節22 int ages[5] = {10, 11, 19, 78, 67};23 24 change(ages);25 26 return 0;27 }28 29 // 利用一個指針來接收一個數組,指針變量array指向了數組的首元素30 void change(int *array)31 {32 printf("%d/n", array[2]);33 //printf("%d/n", *(array+2));34 }35 36 /*37 void change(int array[])38 {39 int s = sizeof(array);40 41 printf("%d/n", s);42 }*/43 44 void test()45 {46 double d = 10.8;47 double *dp;48 dp = &d;49 50 printf("dp = %p/n", dp);51 printf("dp + 1 = %p/n", dp + 1);52 53 int ages[5] = {10, 9, 8, 67, 56};54 55 int *p;56 // 指針變量p指向了數組的首元素57 p = &ages[0];58 // 數組名就是數組的地址,也是數組首元素的地址59 //p = ages;60 61 /*62 p ---> &ages[0]63 p + 1 ---> &ages[1]64 p + 2 ---> &ages[2]65 p + i ---> &ages[i]66 */67 68 //printf("%d/n", *(p+2));69 70 printf("%d/n", p[2]);71 72 /*73 for (int i = 0; i<5; i++) {74 printf("ages[%d] = %d/n", i, *(p+i));75 }*/76 77 78 // printf("%p/n", p);79 // printf("%p/n", p + 1);80 // printf("%p/n", p + 2);81 }
6.指針和字符串
1 #include <stdio.h> 2 3 /* 4 1.常量區 5 存放一些常量字符串 6 7 2.堆 8 對象 9 10 3.棧11 存放局部變量12 13 掌握:14 定義字符串的2種方式15 1> 利用數組16 char name[] = "itcast";17 * 特點:字符串里面的字符是可以修改的18 * 使用場合:字符串的內容需要經常修改19 20 2> 利用指針21 char *name = "itcast";22 * 特點:字符串其實是一個常量字符串,里面的字符是不能修改23 * 使用場合:字符串的內容不需要修改,而且這個字符串經常使用24 */25 26 int main()27 {28 char name[20];29 30 printf("請輸入姓名:/n");31 32 scanf("%s", name);33 34 // 'j' 'a' 'c' 'k' '/0'35 36 //printf("%c/n", name[3]);37 38 //printf("剛才輸入的字符串是:%s/n", name);39 40 return 0;41 }42 43 // 定義字符串數組44 void test2()45 {46 char *name = "jack";47 48 //int ages[5];49 50 // 指針數組(字符串數組)51 char *names[5] = {"jack", "rose", "jake"};52 53 // 二維字符數組(字符串數組)54 char names2[2][10] = {"jack", "rose"};55 }56 57 // 定義字符串58 void test()59 {60 // 字符串變量61 char name[] = "it";62 name[0] = 'T';63 64 //printf("%s/n", name);65 66 67 // "it" == 'i' + 't' + '/0'68 // 指針變量name2指向了字符串的首字符69 70 // 字符串常量71 char *name2 = "it";72 73 char *name3 = "it";74 75 //*name2 = 'T';76 77 //printf("%c/n", *name2);78 79 printf("%p/n%p/n", name2, name3);80 81 //printf("%s/n", name2);82 }
1 #include <stdio.h> 2 /* 3 (不包括/0) 4 編寫一個int string_len(char *s),返回字符串s的字符長度 5 6 */ 7 int string_len(char *s); 8 9 int main()10 {11 //char *name = "itcast";12 13 // 男 /u434/u4343/u43414 15 int size = string_len("tre777");16 17 printf("%d/n", size);18 return 0;19 }20 21 int string_len(char *s)22 {23 // 1.定義一個新的指針變量指向首字符24 char *p = s;25 26 /*27 while ( *s != '/0' )28 {29 s++;30 }*/31 32 while ( *s++ ) ; 33 34 return s - p - 1;35 }36 37 /*38 int string_len(char *s)39 {40 // 記錄字符的個數41 int count = 0;42 43 // 如果指針當前指向的字符不是'/0'44 // 首先*s取出指向的字符45 // 然后s++46 while ( *s++ )47 {48 // 個數+149 count++;50 51 // 讓指針指向下一個字符52 //s = s + 1;53 //s++;54 }55 56 return count;57 }58 */59 60 /*61 int string_len(char *s)62 {63 // 記錄字符的個數64 int count = 0;65 66 // 如果指針當前指向的字符不是'/0'67 while ( *s != '/0')68 {69 // 個數+170 count++;71 72 // 讓指針指向下一個字符73 //s = s + 1;74 s++;75 }76 77 return count;78 }*/
新聞熱點
疑難解答