指针与字符串知识整理 c语言
2018-03-14 20:03
393 查看
一、指针
1. 输出地址printf("%p",&i); //地址
printf("%x",&i); //十六进制整数32bit下两者相同,但是64bit就不同
2. int* p,q; //int *p, int q; 没有int*这种类型,而是*p是int
*p++; //++优先级高于*,但p++为后缀,即取p++以前的值,p指针后移,所以是i=*p,p+1
3. 数组
int a[10]; 相当于 int *const a; 所以不可以有 int b[]; b=a;
a,&a,&a[0]都是相等的,表示数组a的起始地址
*a=a[0]表示a[0]的值
4. i,&i,p,*pint i;
scanf("%d",&i); //i=%d
scanf("%d",i); //&i=%d;
void f(int *p) //若 f(&i)
{
printf("%d",*p); //i
printf("%p",p); //&i
printf("%p",&p); //&p即指针p的地址,即存放i的地址的变量的地址
}5.关于const 和指针
int *const p=&i;
指针p不可修改,不可再指向别的地址,不可有p++;
const int*p=&i;或int const *p=&i
即(*p)为const,不可通过p修改i
可以i++;可以p=&j;不能 *p=j;
二、字符串
1.一个字符串 :
char str[]={'h','i','\0'}
char str[]="hi"
char *str="hi"
计算字符串长度时不包括最后的0,但0要占空间,比如:#include <string.h>
strlen(str); //2
sizeof(a)/sizeof(a[0]); //32.字符串数组:
char str[][5]={"haha","hi",} //hello的占用6个,会报错
ps:在c语言中,若有 char str[][10]={"hello""hi"}<==>{"hellohi"}
双指针和二维数组的区别
单字符输入输出
char *s="hello";
char *s2="hello";
s1和s2都只指向hello字符串,保存同一地址,而hello存放的位置为只读,所以不可以有 s[0]='H'进行修改
如果要修改,则需要 char s[]="hello"即可修改
当传递参数 或需要动态分配数组空间时,使用指针
即字符串数组传入函数中时,函数无法对其修改
避免字符数组越界,如char s1[7];
char s2[7];
scanf("%6s",&s); //一个字符串最多6个字符不包括\0输入:1234567 //则s1:123456, s2:7 此时不管空格和回车
不可以 char *str; scanf("%s",str); 当str本身指向的地址为有害的时候,有可能会出错
4.字符串函数
<string.h>
size_t strlen(const char*s); //不包括‘\0’
int strcmp(const char*str1, char *str2) //0:str1==str2, -1:str1<str2
str1[]="abc";str2[]="Abc";
strcmp(str1,str2); //32: 'a'-'A'
int strncmp(const char*str1, char *str2,size_t n) //前n个字符比较
char *strcpy(char *restrict dst, char *restrict src) //src-->dst
char *strcat(char *restrict s1, char *restrict s2) //s1s2, s1需要有足够的空间
char *strchr(char *str, int c) //返回NULL表示没找到
char str[]="hello";
char *c;
c=strchr(str,'o');
printf("%c",*c); //'o'
char *strrchr(char *str, int c) //从右边开始找
安全版本:
char *strncpy(char *restrict dst, char *restrict src,size_t n)
[b]char *strncat(char *restrict s1, char *restrict s2,size_t n)
[/b]
1. 输出地址printf("%p",&i); //地址
printf("%x",&i); //十六进制整数32bit下两者相同,但是64bit就不同
2. int* p,q; //int *p, int q; 没有int*这种类型,而是*p是int
*p++; //++优先级高于*,但p++为后缀,即取p++以前的值,p指针后移,所以是i=*p,p+1
3. 数组
int a[10]; 相当于 int *const a; 所以不可以有 int b[]; b=a;
a,&a,&a[0]都是相等的,表示数组a的起始地址
*a=a[0]表示a[0]的值
4. i,&i,p,*pint i;
scanf("%d",&i); //i=%d
scanf("%d",i); //&i=%d;
void f(int *p) //若 f(&i)
{
printf("%d",*p); //i
printf("%p",p); //&i
printf("%p",&p); //&p即指针p的地址,即存放i的地址的变量的地址
}5.关于const 和指针
int *const p=&i;
指针p不可修改,不可再指向别的地址,不可有p++;
const int*p=&i;或int const *p=&i
即(*p)为const,不可通过p修改i
可以i++;可以p=&j;不能 *p=j;
二、字符串
1.一个字符串 :
char str[]={'h','i','\0'}
char str[]="hi"
char *str="hi"
计算字符串长度时不包括最后的0,但0要占空间,比如:#include <string.h>
strlen(str); //2
sizeof(a)/sizeof(a[0]); //32.字符串数组:
char str[][5]={"haha","hi",} //hello的占用6个,会报错
ps:在c语言中,若有 char str[][10]={"hello""hi"}<==>{"hellohi"}
双指针和二维数组的区别
char **a; //a是一个指向一个指针,该指针指向一个字符(串) char a[][10] //a[i]-->char [10] char *a[] //a[i]为一个指针,指向某处字符串4.字符串输入输出
单字符输入输出
int putchar(int c) //返回写出了几个字符,正常为1,有误EOF=-1 int getchar() //返回E0F=-1表示输入结束 CTRL-Z(win) CTRL-D(unix)3.字符串操作
char *s="hello";
char *s2="hello";
s1和s2都只指向hello字符串,保存同一地址,而hello存放的位置为只读,所以不可以有 s[0]='H'进行修改
如果要修改,则需要 char s[]="hello"即可修改
当传递参数 或需要动态分配数组空间时,使用指针
即字符串数组传入函数中时,函数无法对其修改
避免字符数组越界,如char s1[7];
char s2[7];
scanf("%6s",&s); //一个字符串最多6个字符不包括\0输入:1234567 //则s1:123456, s2:7 此时不管空格和回车
不可以 char *str; scanf("%s",str); 当str本身指向的地址为有害的时候,有可能会出错
4.字符串函数
<string.h>
size_t strlen(const char*s); //不包括‘\0’
int strcmp(const char*str1, char *str2) //0:str1==str2, -1:str1<str2
str1[]="abc";str2[]="Abc";
strcmp(str1,str2); //32: 'a'-'A'
int strncmp(const char*str1, char *str2,size_t n) //前n个字符比较
char *strcpy(char *restrict dst, char *restrict src) //src-->dst
char *strcat(char *restrict s1, char *restrict s2) //s1s2, s1需要有足够的空间
char *strchr(char *str, int c) //返回NULL表示没找到
char str[]="hello";
char *c;
c=strchr(str,'o');
printf("%c",*c); //'o'
char *strrchr(char *str, int c) //从右边开始找
安全版本:
char *strncpy(char *restrict dst, char *restrict src,size_t n)
[b]char *strncat(char *restrict s1, char *restrict s2,size_t n)
[/b]
相关文章推荐
- c语言:字符串与字符串指针变量
- 【C语言】【指针相关知识小结】
- 【整理】C语言中常见的字符串操作函数
- 黑马程序员--c语言:字符串、指针
- C语言中字符数组和字符串指针分析
- c语言学习之基础知识点介绍(十四):指针的进阶
- C语言中字符数组和字符串指针分析(转载)
- IOS开发---C语言-⑫指针与数组、字符串
- 第09天C语言(03):指针和字符串的注意点
- C语言指针和数组知识总结(上)
- C语言中字符数组和字符串指针分析
- C语言中指针知识汇总
- 理解C语言——从小菜到大神的晋级之路(8)——数组、指针和字符串
- 归纳整理Linux下C语言常用的库函数----内存及字符串控制及操作
- C语言中字符数组和字符串指针分析
- 【C语言】11 指针和字符串
- 【C语言的学习】第十二回合:指针知识大集合
- C语言中关于数组与指针和字符串与指针的小结
- C语言字符串的指针—字符串的表示形式
- c语言核心整理之指针与数组的区别