指针与字符串知识整理 c语言

一、指针

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 和指针

扫描二维码关注公众号,回复: 11321628 查看本文章
  • 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

猜你喜欢

转载自blog.csdn.net/scarletteshu/article/details/79558716