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 PRintf("a=%d/n", a);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 }*/
新闻热点
疑难解答