5.2.4 strcat()
头文件:#include 原型:char *strcat(char *dest, const char *src); 功能: 将src追加到dest的后面 参数: dest:目的字符串 src:源字符串 返回值: 追加后字符串的首地址
char *strncat(char *dest, const char *src, size_t n); #include <stdio.h> #include <string.h> int main(int argc, const char *argv[]) { char s1[32] ="hello wo\0rldadadjajdalsdkjaskdj"; //hello woabcdefg\0 char s2[32] ="abcdefg\0higk"; strcat(s1,s2); printf("s1 = %s\n",s1); return 0; }
5.2.5 自己实现strcpy函数的功能
#include <stdio.h> char *my_strcpy(char *s1,char *s2) { if(NULL == s1 || NULL == s2) { return NULL; } int i = 0; while(s2[i] != '\0') { s1[i] = s2[i]; i++; } s1[i] = '\0'; return s1; } int main() { char s1[] = "hello world"; char s2[] = "world"; char *result = my_strcpy(s1,s2); for(int i = 0; i < sizeof(s1)/sizeof(s1[0]); i++) { printf("[%c] %d\n",result[i],result[i]); } return 0; }
六、指针
6.1 指针的用途
使用程序简洁,紧凑,高效 有效地表示复杂的数据结构 动态分配内存 得到多于一个函数的返回值
6.2 指针的概念
当程序中定义一个变量之后,程序就会为这个变量在内存中开辟内存空间,我们内存中每一个字节的空间都有一个编号,将这个编号称之为地址,地址也叫做指针
在不影响理解的情况,有时对地址,指针,指针变量不区分,通称指针
&:取地址符
*:
1.定义时,如果前面是一种类型,表示这是一条定义语句,定义一个指针变量,pa是一个指针,指向整数a
2.使用时,*pa = 100;*表示取值的意思,取指针pa指向的内存的值
pa = 地址
#include <stdio.h> int main(int argc, const char *argv[]) { //int a = 1; //int *pa = &a; printf("int* = %ld\n",sizeof(int *)); printf("char* = %ld\n",sizeof(char *)); printf("double* = %ld\n",sizeof(double *)); printf("float* = %ld\n",sizeof(float *)); printf("long* = %ld\n",sizeof(long *)); int a = 1; char ch = 'a'; //int *pc = &ch; //类型不兼容 char *pch = &ch; //ch = 'x'; *pch = 'x'; //等价于ch = 'x' printf("ch = %c\n",ch); printf("ch = %c\n",*pch); int *pa = &a; printf("%p\n",pch); printf("%p\n",pa); printf("%p\n",pch + 1); //不同类型的指针,步长不一样 printf("%p\n",pa + 1); return 0; }
6.3 指针变量的运算
指针运算是以指针变量所存放的地址量作为运算量而进行运算的。
因此,指针运算的实质就是地址的运算。
指针运算的种类是有限的,它只能进行算术运算,关系运算和赋值运算
6.3.1 算术运算符
+: px + n 指针向地址大的方向移动n个数据 -: px - n 指针向地址小的方向移动n个数据 ++: px++ 指针向地址大的方向移动1个数据 --: px++ 指针向地址小的方向移动1个数据
指针变量加减,表示指针变量向地址大或小的方向移动N个操作空间,两个指针变量相减,表示两个地址之间有多少个操作空间(多少个元素)
注意,两个指针做运算,必须是同类型的,类型不同没有任何意义。
一个指针变量加减有意义,乘除没有意义
后置++优先级高于前置++ 后置++结合律从左往右 前置++和*优先级相同,结合律从右往左
#include <stdio.h> int main(int argc, const char *argv[]) { int arr[6] = {1,3,5,8,9,10}; int *p1 = arr; printf("*p1 = %d\n",*p1); p1++; int *p2 = p1++; printf("*p1 = %d,*p2 = %d\n",*p1,*p2); printf("p1 - p2 = %ld\n",p1 - p2); int y = *p1; //取值 printf("y = %d\n",y); y = ++*p1; printf("y = %d\n",y); y = (*p1)++; printf("y = %d\n",y); y = *p1++; //赋值完成后,指针px加1 printf("y = %d\n",y); printf("*p1 = %d\n",*p1); /*y = ++*p1++; //赋值完成后,指针px加1 printf("y = %d\n",y); printf("*p1 = %d\n",*p1); */ return 0; }
6.3.2 关系运算符
> px > py < >= <= != ==
两个指针变量可以通过关系运算符来判断保存地址的大小
两指针之间的关系运算符表示他们指向的地址位置之间的关系,指向地址大的指针大于指向地址小的指针
具有不同数据类型的指针之间的关系运算没有意义,指向不同数据区域的数据两个指针之间,关系运算符也没有意义。
指针与一般整数变量之间的关系运算也没有意义,但是可以和零进行等于或者不等于的关系运算,判断指针是否为空,一般与NULL
6.3.3 赋值运算
指针变量直接可以直接赋值,但是不能将一个整数赋值给指针变量,因为没有开辟空间
指针赋值运算是通过赋值运算符向指针变量送一个地址值,
6.2.4 练习:输入一个字符串,将字符串的元素翻转
#include <stdio.h> #include <string.h> int main(int argc, const char *argv[]) { char str[32] = {0}; gets(str); printf("反转之前的字符串:%s\n",str); char *p = NULL,*q = NULL; char tmp; p = &str[0]; q = &str[strlen(str) - 1]; #if 0 while(p < q) { tmp = *p; *p = *q; *q = tmp; p++; q--; } #endif for(;p < q;p++,q--) { tmp = *p; *p = *q; *q = tmp; } printf("反转之后的字符串:%s\n",str); return 0; }
七、指针和一维数组
#include <stdio.h> #include <string.h> int main(int argc, const char *argv[]) { int a[5] = {1,2,3,4,5}; int *p = a; int i; for(i = 0 ; i < 5;i++) { //printf("%d ",a[i]); printf("%d ",*(p+i)); } putchar(10); char *s = "helloworld"; char str[32] ="hello nanjing"; s = str; //printf("%s\n",s); for(i = 0 ; i < 10;i++) { printf("%c",s[i]); } putchar(10); return 0; }
练习
练习1:通过指针自己实现strlen函数的功能
#include <stdio.h> int main(int argc, const char *argv[]) { char buf[32] = {0}; printf("请输入一个字符串:\n"); gets(buf); char *p = buf; int i; while(*p != '\0') { p++; i++; } printf("strlen(buf) = %d\n",i); return 0; }
练习2: 通过指针实现strcpy函数的功能
#include <stdio.h> int main(int argc, const char *argv[]) { char s1[] = "helloworld!"; char s2[] = "abcdefghijk"; char *p = NULL,*q = NULL; p = s1; q = s2; while(*q != '\0') { *p = *q; p++; q++; } *p = *q; printf("s1 = %s\n",s1); return 0; }
作业
作业:
1.通过指针实现strcat功能
#include <stdio.h> #include <string.h> int main(int argc, char const *argv[]) { char s1[32] = "hello world"; char s2[] = "abcdefg"; char *p1 = &s1[strlen(s1)]; char *p2 = s2; while(*p2 != '\0') { *p1 = *p2; p1++; p2++; } *p1 = '\0'; printf("%s\n",s1); return 0; }
2.实现atoi函数的功能
char str[] = '5891";
int num;
…
“5891” ----->5891
3. 输入一个字符串,输出字符串中有多少个空格
4. 输入两个字符串,判断一个字符串是否为另一个的子串
s1 = hellloworld s2 = oworl