黑马程序员——C语言中的指针

来源:互联网 发布:卖家怎么玩好淘宝客 编辑:程序博客网 时间:2024/05/16 12:25
------<a href="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! -------

一、指针介绍

1.指针的重要性

指针是C语言中非常重要的数据类型,如果你说C语言中除了指针,其他你都学得很好,那你干脆说没学过C语言。

以后在OC中也是要经常的用到指针,有些难度比较大的指针只需要理解就可以了


二、指针变量的定义

1.定义的格式

类名标识符  *指针变量名;

[objc] view plaincopy
  1. intint *p;  

2.先定义后赋值

简单取值并简单改值

[objc] view plaincopy
  1. int a = 10;  
  2. intint *p;  
  3. p = &a;  
  4. *p=100;  

3.定义的同时赋值

[objc] view plaincopy
  1. int a = 10;  
  2. intint *p = &a;  

4.实现修改实参

5.注意点

其他指针类型说明,比如

[objc] view plaincopy
  1. floatfloat *p;   
  2. charchar *p;  

不能乱用类型,比如

[objc] view plaincopy
  1. int a = 10;  floatfloat *p = &a;  
  2. //它们的数据类型不同  

6.清空指针

[objc] view plaincopy
  1. p = 0;  
  2. p = NULL;  

三、指针实例

1.利用指针交换两个数的值

[objc] view plaincopy
  1. #include <stdio.h>  
  2. //定义函数,利用指针交换两个数的值  
  3. void swap(intint *v1,intint *v2)  
  4. {  
  5.     int temp = *v1;  
  6.     *v1 = *v2;  
  7.     *v2 = temp;  
  8. }  
  9.   
  10. int main()  
  11. {  
  12. //定义两个要交换的数  
  13.     int a1 = 100;  
  14.     int a2 = 200;  
  15.   
  16.     swap(&a1,&a2);  
  17.     printf("a1=%d,a2=%d\n",a1,a2);  
  18.   
  19.     return 0;  
  20. }  
2.分别输出char,int,long类型数据和指针占用的内存字节数

[objc] view plaincopy
  1. #include <stdio.h>  
  2.   
  3. void test()  
  4. {  
  5.     char c; //占用字节数为 1  
  6.     int a; // 占用字节数为4  
  7.     long b; // 占用字节数为8  
  8.       
  9.     // 任何指针都占用8个字节的存储空间  
  10.     charchar *cp;  
  11.     intint *ap;  
  12.     longlong *bp;  
  13.       
  14.     printf("c=%zd, a=%zd, b=%zd\n",sizeof(*cp),sizeof(*ap),sizeof(*bp));  
  15.     printf("cp=%zd, ap=%zd, bp=%zd\n",sizeof(cp),sizeof(ap),sizeof(bp));  
  16. }  
  17.   
  18. int main()  
  19. {  
  20.     test();  
  21.     return 0;  
  22. }  
3.定义一个函数返回两个数的和以及差

[objc] view plaincopy
  1. int sumAndMinus(int number1,int number2,intint *number3)  
  2. {  
  3.     *number3 = number1 - number2;  
  4.     return number1+number2;  
  5. }  
4.连接两个字符串,使用指针和不使用指针两种方式
[objc] view plaincopy
  1. #include <stdio.h>  
  2.   
  3. void str_link1(char str1[],char str2[])  
  4. {  
  5.     int i = 0,j = 0;  
  6. //如果++i不为空则继续自加,如果为空,循环终止  
  7.     while (str1[++i]);  
  8. //将字符串2连接到字符串1  
  9.     while ((str1[i++] = str2[j++]) != '\0');  
  10. }  
  11.   
  12. void str_link2(charchar *s,charchar *p)  
  13. {  
  14. //str_link1与同理  
  15.     while (*++s);  
  16.     while (*s++ = *p++);  
  17. }  
  18.   
  19. int main()  
  20. {  
  21.     char s1[20];  
  22.     char s2[20];  
  23. //输入字符串1和字符串2  
  24.     printf("Please enter string1:");  
  25.     scanf("%s",s1);  
  26.     printf("Please enter string2:");  
  27.     scanf("%s",s2);  
  28.       
  29. //输出两个字符串连接后的结果  
  30.     printf("%s+%s=",s1,s2);  
  31.     str_link1(s1,s2);  
  32.     printf("%s\n",s1);  
  33.       
  34.       
  35.     char s3[20];  
  36.     char s4[20];  
  37. //输入字符串3和字符串4  
  38.     printf("Please enter string3:");  
  39.     scanf("%s",s3);  
  40.     printf("Please enter string4:");  
  41.     scanf("%s",s4);  
  42.       
  43. //输出两个字符串连接后的结果  
  44.     printf("%s+%s=",s3,s4);  
  45.     str_link2(s3,s4);  
  46.     printf("%s\n",s3);  
  47.       
  48.     return 0;  
  49. }  

四、指针与数组

1.指向一维数组元素的指针

2.用指针遍历一维数组元素

先遍历char数组(‘i’,’t’),再遍历int类型数组

*(p+i)*(p++)的区别

a+ia++

p[0]p[1]


五、指针与字符串

1.字符串回顾

char s[] = “mj”;

2.其他定义字符串的方式

char *s = “mj”;

或者

char *s;

s = “mj”;

3.两种定义方式的区别

内存分析

画图分析

常量和变量字符串的区别

常量的内存地址查看


六、返回指针的函数

指针也是C语言中的一种数据类型,因此一个函数的返回值肯定可以是指针类型的

返回指针的函数的一般形式为:类型名 *函数名(参数列表)

[objc] view plaincopy
  1. #include <stdio.h>  
  2.   
  3. //将指针指向的字符串改为"rose"  
  4. charchar *test()  
  5. {  
  6.     return "rose";  
  7. }  
  8.   
  9. int main()  
  10. {  
  11.     charchar *name = test();  
  12.       
  13.     printf("name=%s\n", name);  
  14.       
  15.     return 0;  
  16. }  


七、指向函数的指针

1.为什么指针可以指向一个函数?

函数作为一段程序,在内存中也要占据部分存储空间,它也有一个起始地址,即函数的入口地址。函数有自己的地址,那就好办了,我们的指针变量就是用来存储地址的。因此,可以利用一个指针指向一个函数。其中,函数名就代表着函数的地址。

2.指向函数的指针的定义

定义的一般形式:函数的返回值类型 (*指针变量名)(形参1,形参2, ...);

[objc] view plaincopy
  1. //1. 定义指向函数的指针  
  2.     double (*p)(doublecharchar *, int);  
  3.     p = haha;  
  4. // 或者  
  5.     double (*p2)(doublecharchar *, int) = haha;  
  6. //2.间接调用函数  
  7. p(10.7"jack"10);  
  8. // 或者  
  9. (*p2)(10.7"jack"10);  

3.使用注意

由于这类指针变量存储的是一个函数的入口地址,所以对它们作加减运算(比如p++)是无意义的

指向函数的指针变量主要有两个用途:

• 调用函数

• 将函数作为参数在函数间传递

指针的进一步练习:

[objc] view plaincopy

  1.  *题目: 编写一个int string_len(char *s),返回字符串s的字符长度 
  2.  ****************************************************************************/  
  3.   
  4. int string_len(charchar *s);  
  5.   
  6. int main()  
  7. {  
  8.     charchar *name = "itcast";  
  9.     char str[] = "itcast";  
  10.       
  11.     int s0 = string_len("tre777");  
  12. //字符串数组最后面有一个'\0'  
  13.     int s1 = sizeof(str)/sizeof(char)-1;  
  14.     int s2 = sizeof(name);  
  15.       
  16.     printf("%d,%d,%d\n", s0,s1,s2);  
  17.     return 0;  
  18. }  
  19.   
  20. int string_len(charchar *s)  
  21. {  
  22.     // 1.定义一个新的指针变量指向首字符  
  23.     charchar *p = s;  
  24. //当*s++=='\0'时循环终止  
  25.     while ( *s++ ) ;  
  26.       
  27.     return s - p - 1;  
  28. }  


[objc] view plaincopy
  1. /****************************************************************************  * 
  2.  *题目: 
  3.  *编写一个函数,判断某个字符串是否为回文。 
  4.  * 回文就是从左边开始读 和 从右边开始读 都是一样的,比如"abcba" 
  5.  ****************************************************************************/  
  6. //方式1,使用for循环不使用指针  
  7. int isHuiWen1(char str[])  
  8. {  
  9.     for (int i=0; i<strlen(str); i++)  
  10.     {  
  11.         if (str[i] != str[strlen(str)-i-1])  
  12.         {  
  13.             return 0;  
  14.         }  
  15.     }  
  16.       
  17.     return 1;  
  18. }  
  19.   
  20. //方式2,使用for循环使用指针  
  21. int isHuiWen2(charchar *str)  
  22. {  
  23.     for (int i=0; i<strlen(str); i++)  
  24.     {  
  25.         if (str[i] != str[strlen(str)-i-1])  
  26.         {  
  27.             return 0;  
  28.         }  
  29.     }  
  30.       
  31.     return 1;  
  32. }  
  33.   
  34. //方式3,使用while循环使用指针  
  35. int isHuiWen3(charchar *str)  
  36. {  
  37.     charchar *left = str;  
  38.     charchar *right = str + strlen(str) - 1;  
  39.       
  40.     while (left < right)  
  41.     {  
  42.         if (*left++ != *right--)  
  43.         {  
  44.             return 0;  
  45.         }  
  46.     }  
  47.       
  48.     return 1;  
  49. }  

0 0