------<a href="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! -------
一、指针介绍
1.指针的重要性
指针是C语言中非常重要的数据类型,如果你说C语言中除了指针,其他你都学得很好,那你干脆说没学过C语言。
以后在OC中也是要经常的用到指针,有些难度比较大的指针只需要理解就可以了
二、指针变量的定义
1.定义的格式
类名标识符 *指针变量名;
- intint *p;
2.先定义后赋值
简单取值并简单改值
- int a = 10;
- intint *p;
- p = &a;
- *p=100;
3.定义的同时赋值
- int a = 10;
- intint *p = &a;
4.实现修改实参
5.注意点
其他指针类型说明,比如
- floatfloat *p;
- charchar *p;
不能乱用类型,比如
- int a = 10; floatfloat *p = &a;
- //它们的数据类型不同
6.清空指针
- p = 0;
- p = NULL;
三、指针实例
1.利用指针交换两个数的值
- #include <stdio.h>
- //定义函数,利用指针交换两个数的值
- void swap(intint *v1,intint *v2)
- {
- int temp = *v1;
- *v1 = *v2;
- *v2 = temp;
- }
- int main()
- {
- //定义两个要交换的数
- int a1 = 100;
- int a2 = 200;
- swap(&a1,&a2);
- printf("a1=%d,a2=%d\n",a1,a2);
- return 0;
- }
- #include <stdio.h>
- void test()
- {
- char c; //占用字节数为 1
- int a; // 占用字节数为4
- long b; // 占用字节数为8
- // 任何指针都占用8个字节的存储空间
- charchar *cp;
- intint *ap;
- longlong *bp;
- printf("c=%zd, a=%zd, b=%zd\n",sizeof(*cp),sizeof(*ap),sizeof(*bp));
- printf("cp=%zd, ap=%zd, bp=%zd\n",sizeof(cp),sizeof(ap),sizeof(bp));
- }
- int main()
- {
- test();
- return 0;
- }
- int sumAndMinus(int number1,int number2,intint *number3)
- {
- *number3 = number1 - number2;
- return number1+number2;
- }
- #include <stdio.h>
- void str_link1(char str1[],char str2[])
- {
- int i = 0,j = 0;
- //如果++i不为空则继续自加,如果为空,循环终止
- while (str1[++i]);
- //将字符串2连接到字符串1
- while ((str1[i++] = str2[j++]) != '\0');
- }
- void str_link2(charchar *s,charchar *p)
- {
- //str_link1与同理
- while (*++s);
- while (*s++ = *p++);
- }
- int main()
- {
- char s1[20];
- char s2[20];
- //输入字符串1和字符串2
- printf("Please enter string1:");
- scanf("%s",s1);
- printf("Please enter string2:");
- scanf("%s",s2);
- //输出两个字符串连接后的结果
- printf("%s+%s=",s1,s2);
- str_link1(s1,s2);
- printf("%s\n",s1);
- char s3[20];
- char s4[20];
- //输入字符串3和字符串4
- printf("Please enter string3:");
- scanf("%s",s3);
- printf("Please enter string4:");
- scanf("%s",s4);
- //输出两个字符串连接后的结果
- printf("%s+%s=",s3,s4);
- str_link2(s3,s4);
- printf("%s\n",s3);
- return 0;
- }
四、指针与数组
1.指向一维数组元素的指针
2.用指针遍历一维数组元素
先遍历char数组(‘i’,’t’),再遍历int类型数组
*(p+i)和*(p++)的区别
a+i和a++
p[0]、p[1]
五、指针与字符串
1.字符串回顾
char s[] = “mj”;
2.其他定义字符串的方式
char *s = “mj”;
或者
char *s;
s = “mj”;
3.两种定义方式的区别
内存分析
画图分析
常量和变量字符串的区别
常量的内存地址查看
六、返回指针的函数
指针也是C语言中的一种数据类型,因此一个函数的返回值肯定可以是指针类型的
返回指针的函数的一般形式为:类型名 *函数名(参数列表)
- #include <stdio.h>
- //将指针指向的字符串改为"rose"
- charchar *test()
- {
- return "rose";
- }
- int main()
- {
- charchar *name = test();
- printf("name=%s\n", name);
- return 0;
- }
七、指向函数的指针
1.为什么指针可以指向一个函数?
函数作为一段程序,在内存中也要占据部分存储空间,它也有一个起始地址,即函数的入口地址。函数有自己的地址,那就好办了,我们的指针变量就是用来存储地址的。因此,可以利用一个指针指向一个函数。其中,函数名就代表着函数的地址。
2.指向函数的指针的定义
定义的一般形式:函数的返回值类型 (*指针变量名)(形参1,形参2, ...);
- //1. 定义指向函数的指针
- double (*p)(double, charchar *, int);
- p = haha;
- // 或者
- double (*p2)(double, charchar *, int) = haha;
- //2.间接调用函数
- p(10.7, "jack", 10);
- // 或者
- (*p2)(10.7, "jack", 10);
3.使用注意
由于这类指针变量存储的是一个函数的入口地址,所以对它们作加减运算(比如p++)是无意义的
指向函数的指针变量主要有两个用途:
• 调用函数
• 将函数作为参数在函数间传递
指针的进一步练习:
- *题目: 编写一个int string_len(char *s),返回字符串s的字符长度
- ****************************************************************************/
- int string_len(charchar *s);
- int main()
- {
- charchar *name = "itcast";
- char str[] = "itcast";
- int s0 = string_len("tre777");
- //字符串数组最后面有一个'\0'
- int s1 = sizeof(str)/sizeof(char)-1;
- int s2 = sizeof(name);
- printf("%d,%d,%d\n", s0,s1,s2);
- return 0;
- }
- int string_len(charchar *s)
- {
- // 1.定义一个新的指针变量指向首字符
- charchar *p = s;
- //当*s++=='\0'时循环终止
- while ( *s++ ) ;
- return s - p - 1;
- }
- /**************************************************************************** *
- *题目:
- *编写一个函数,判断某个字符串是否为回文。
- * 回文就是从左边开始读 和 从右边开始读 都是一样的,比如"abcba"
- ****************************************************************************/
- //方式1,使用for循环不使用指针
- int isHuiWen1(char str[])
- {
- for (int i=0; i<strlen(str); i++)
- {
- if (str[i] != str[strlen(str)-i-1])
- {
- return 0;
- }
- }
- return 1;
- }
- //方式2,使用for循环使用指针
- int isHuiWen2(charchar *str)
- {
- for (int i=0; i<strlen(str); i++)
- {
- if (str[i] != str[strlen(str)-i-1])
- {
- return 0;
- }
- }
- return 1;
- }
- //方式3,使用while循环使用指针
- int isHuiWen3(charchar *str)
- {
- charchar *left = str;
- charchar *right = str + strlen(str) - 1;
- while (left < right)
- {
- if (*left++ != *right--)
- {
- return 0;
- }
- }
- return 1;
- }