C语言 指针与字符串
指针是可计算的
1+1=2?
- 给一个指针加1 表示要让指针指向下一个变量
‘’’ int a[10];
int * p =a;
*(p+1) ->a[1] - 如果指针不是指向一片连续分配的空间,如数组,则这种运算没有意义
指针计算
-
指针可以做下列这些算数运算
-
给指针加减一个整数(+,+=,-,-=)
-
递增递减(++/–)
-
两个指针相减
*P++
- 取出p所指的那个数据,完事之后顺便把p移到限一个位置去
- *的优先级虽高,但没有++高
- 常用于数组类的连续空间操作
- 在某些CPU上,这可以直接翻译成一条汇编指令
指针比较
- < , <=, ==,>,>=,!=都可以对指针做
- 比较它们在内存中的地址;
- 数组中的单元的地址肯定是线性递增的;
0地址
- 内存中存在0地址,但是 0 地址通常是个不能随便碰的地址;
- 指针不应该具有 0的值
- 0地址来表示特殊的事情
返回的指针是无效的
指针没有真正的初始化- NULL 是一个预定定义的符号,表示0地址
有的编译器不愿意你用0来表示0地址
- NULL 是一个预定定义的符号,表示0地址
指针的类型
- void* 表示不知道指向什么东西的指针
计算时与char * 相同(但不相通) - 指针也可以进行转换类型
int *p = & i;
void *q= (void *)p; - 这并没有改变p所指的变量类型,而是让后人用不同的眼光通过p看它所指的变量
用指标来做什么
- 需要传入较大的数据时用做参数
- 传入数组后对数组做操作
- 函数返回不止一个结果
需要用函数来修改不止一个变量 - 动态申请内存
动态内存分配
输入数据
- int * a =(int *) malloc (n *sizeof(int));
malloc( )
#include<stdlib.h>
void * malloc(size_t zize)
- 向malloc申请的空间的大小是以字节为单位的;
- 返回的结果是 void* ,需要类型转换为自己需要的类型
(int )malloc(nsizeof(int)) - 如果申请失败则返回0 ,或者叫做NULL
free( )
- 把申请的来的空间还给"系统"
- 申请过的空间,最终都应该要还
- 只能还申请来的空间的首地址
字符串操作
putchar
- int putchar (int c) 向标准输出写一个字符,返回写了几个字符,EOF(-1)表示写失败
getchar
- int getchar(void); 从标准输入读入一个字符,返回类型是为了返回EOF(-1)
字符串数组string.h
- strlen :
- size-t strlen(const char *s)
- strcmp:
int mycmp(const char *s1,const char* s2)
{
int idx =0;
- ① while(s1[idx]==s2[idx] &&s1[idx]!='\0'){
idx ++;
}
- ② while (*s1 == *s2 && s1 != '\0'){
s1++;
s2++;
}
return *s1- *s2;
}
strcpy
- char * strcpy(char *restrict dst ,const char *restrict src);
- 把src的字符串拷贝到dst ,restrict表明src和dst不重叠(C99) ,返回dst,为了能链起代码来
- char dst = (char)malloc (strlen(src)+1);
strcpy(dst,src);
char *mycpy( char *dst char *src)
{
int idx = 0;
① while(src[idx] != '\0') {
dst[idx] =src[idx];
idx++;
}
dst[idx]='\0';
return dst;
②char *ret =dst
while(*dst++ = *src++)
;
*dst = '\0'
return ret
}
字符串中找字符
- char *strchr(const *s ,int c);
- char *strrchr(const char *s,int c);
- 返回NULL表示没有找到
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main( int argc, char const *argv[])
{
char s[] = "hello " ;
char *p = strchr(s,'l');
char c =*p;
*p='\0';
char *t = (char*)malloc(strlen(s)+1);
strcpy(t,s);
printf("%s\n",t);
free(t);
return 0;
}
- char *strstr(const char *s1,const char *s2);
- char *strcasestr(const *s1,const char *s2);