一、指针
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,*p
int 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]); //3
2.字符串数组:
- 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)
char *strncat(char *restrict s1, char *restrict s2,size_t n)