鸦领主 发表于 2020-12-23 15:22:22

C语言学习第十天 初识指针 常用系统字符串函数认识

本帖最后由 鸦领主 于 2020-12-26 21:44 编辑

1.指针

a)指针的概念:
指针的定义:内存变量或者数组变量内存地址就是指针;
指针变量:存放指针(内存地址)的变量称为指针变量
任何类型的指针变量的空间大小都是4个字节
指针变量记录的内存地址,也称它为指向的地址
指针变量的定义:
变量类型 * 指针变量名称[=地址]
          int *p=&i
同时定义俩个以上的指针变量时,每个变量前面都要加*

b)指针变量的赋值:
指针变量不可以直接用整数变量或者常量赋值
列如:
int *p=200 错误,不能使用整数常量赋值
int i=200, *p1=i 错误,p1是指针变量,i是整型变量
int i;
int *p=&i 错误,数组名也是常量
int *p=i或 *p=&i 都是将数组首地址赋值给指针

各种不同类的指针变量之间不能直接赋值(除非强制转换语句)
列如:
int i;
int *p=&i 正确,同类型
char *c=p 错误,不同类型
int i=1;
int n=0;
int *p=&i;
//把i赋值给n
n=i;
n=p;//这个三句都是一样的意思
n=*p;
指针变量的目的是:从目标读取数据,对目标写入数据

2.strtok函数(字符串拆分函数)需要#include <string.h>
格式:
strtok(要拆分的内容,间断的符号)
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
int main()
{
    char c[] = "ab cd ef gh";
    char *p =strtok(c, " ");//把需要拆分的内容带进去,然后以空格为间隔,截断空格之前的东西
    printf("%s", p);//那么就会打印出空格之前的东西ab

    return 0;
}

做一个循环,将内容全部拆分出来
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
int main()
{
    char c[] = "ab cd ef gh";
    char *p =strtok(c, " ");//把需要拆分的内容带进去,然后以空格为间隔,截断空格之前的东西
    while (p!=NULL) //NULL就是' '空,如果p的内容不为空的话继续循环
    {
      printf("%s\n", p); //每循环一次就会打印出符号之间的东西
      p = strtok(NULL, " "); //在循环打印
    }
    return 0;
}
正常情况下,我们无法对一个整数的数组一次性输入所有数值(或者可以使用do..while将整数数组一次性输入)
那么我们可以定义一个字符串类型的,然后再将输入的内容拆分,转换成整数类型的
定义一个字符串数组,输入几个数字求出平均值
(atoi函数将一个字符串转换成一个整数。atoi(要进行转换的字符串))需要#include<stdlib.h>
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include<stdlib.h>
int main()
{
    char c;
    int i;
    gets_s(c, sizeof(c));
    char* p = strtok(c, " ");
    int n = 0;
    float t = 0;
    while (p != NULL)
    {
      i = atoi(p); //将字符串转换成整数
      p = strtok(NULL, " ");
      t = t + i; //每循环一次t加一次i的值
      n++;
    }
    printf("共输入了%d个数字\n平均值是%0.2f", n, t / n);
    return(0);
}

3.strlen(计算输入的字符串长度)需要#include <string.h>
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
intzfccd(char c[])
{
    int i = 0;
    while (i)
    {
      i++;
    }
    return i;
}
//上面是自己定义的函数,功能和strlen函数一样。也可以说是strlen函数的原理
int main()
{
    char c;
    scanf("%s", &c);
    int a=strlen(c);//算出输入的字符串的长度
    printf("字符串长度为%d", a);
    return(0);
}

4.strcpy(字符串复制)需要#include <string.h>
格式strcpy(粘贴的位置 , 要复制的内容)
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
void cpy(char c1[], char c2[])
{
    int i = 0;
    do
   {
      c1 = c2; //先将c1等于c2
    }while (c2); //再进行判断,最后在加1
}
//上面是自己定义的函数,功能和strcpy函数一样。也可以说是strcpy函数的原理
int main()
{
    char c;
    char s;
    scanf("%s", &c);
    strcpy(s, c); //将c数组的内容复制给s数组
    puts(s);
    printf("%d", strlen(s));
    return(0);
}


4.strcat(将两个字符数组连接)需要#include <string.h>
格式:strcat(数组1,数组2)也就是把数组2连接到数组1
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
void cat(char* p1, char* p2)
{
    int i = 0;
    while (p1)
    {
      i++;
    }
    int n = 0;
    do
    {
      p1= p2;
      i++;
    } while (p2);
}
//上面是自己定义的函数,功能和strcat函数一样。也可以说是strcat函数的原理
int main()
{
    char src, dest;
    strcpy(dest, "This is source");
    strcpy(src, "This is destination");
    strcat(dest, src); //带入俩个数组将src连接到dest
    printf("最终的目标字符串: |%s|", dest); //将第一个表达式打印出来
    return(0);
}
连接代码文字解释



5.strcmp函数(比较俩个字符串大小,不是比较长度) 需要#include <string.h>
格式:strcmp(数组1,数组2) 填入俩个需要比较大小的字符串数组
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
int cmp(char* p1, char* p2)
{                                                                  
    unsigned char* c1 = (unsigned char*)p1;//汉字比较大小,char类型的0x80后面都是负数了所以用unsigned char无符号
    unsigned char* c2 = (unsigned char*)p2;//不能直接转换,强行转换一下,就能够看清一个负数为什么大了(也可以不转换)
    int i = 0;                                                    //比如“我”这个字值是-50,那么转换一下就是206
    while (c1 && c1==c2) //c1不等于\0而且 c1等于ci
    {                                             //如果c2是\0,则不满足第二个条件         
      i++;
    }
    return c1-c2;//如果c1大那么相减就会得出一个>0的数,相同就=0
}                           //c2大那么会得出一个<0的数。返回出去
//上面是自己定义的函数,功能和strcmp函数一样。也可以说是strcmp函数的原理
int main()
{
    char c = "a", s = "bc"; //a在ASCII里面是97,b是98则b, 返回-1,后面的值不在进行比较
    int a=cmp(c, s);//返回>0代表c大,返回<0则s大,返回0则一样大
    if (a > 0)
      printf("左边大");
    if (a < 0)
      printf("右边大");
    if (a == 0)
      printf("一样大");
    return 0;
}


6.内存四区的特点:
a)全局区的变量空间缺省每个字节都是00,栈内空间是cc,堆是cd。
b)堆,全局区(静态区),字符常量区位置比较靠近,与栈空间的位置相距较大。
c)常量区的内存是只可读,不能写入,写入的话就会崩溃。
d)访问速度可能是栈区最快,其它三个区域是带有公用性质的区,域访问熟读可能会稍微慢些。

7.万能指针类型(void *)
任何类型指针都可以赋值给void指针,不需要强制转换
比如
char *p=&i
int *n=&t

void *v=p
v=n
但是void指针赋值给别的类型需要强制转换
p=(char *)v
n=(int *)v

8.memory类型函数认识
a)memset函数是将某一块内存中的内容全部设置为指定的值,这个函数通常为新申请的内存做初始化工作。
格式:memset(c, '*', 5)你要指定的内容 , 指定为什么 , 指定多少
#include<stdio.h>
#include<string.h>
void mset(void* v, char c, int i)
{
    char* s = (char*)v;//需要使用*v强制转换为char类型
    while (i!=-1)
      s[--i]=c;
}
int main()
{
    char c[] = { "weqwewqesdasdcvbcvbvcb" };
    char b[]= { "weqwewqesdasdcvbcvbvcb" };
    printf("%s\n", c);
    memset(c, '*', 5);//系统函数,将内存里面前5个改变为*
    printf("%s\n", c);
    mset(b,'#',5);//自定义函数,将内存里面前5个改变为#
    printf("%s", b);

    return 0;
}


b)memcpy函数函数的功能是从源内存地址的起始位置开始拷贝若干个字节到目标内存地址中
格式:memcpy(b, c,19) 要复制到的地方,要复制的内容,要复制多少个字节
#include<stdio.h>
#include<string.h>
void mcpy(void* v,void *o, int i)
{
    char* p = (char*)v;
    char* p1 = (char*)o;
    int n = 0;
    while (n<i)
    {
      p = p1;
      n++;
    }
}
int main()
{
    char c ="qweasdzxcrtyfghvbn" ;
    char a = "poilkjmnbhygujkjuh";
    char b;
    memcpy(b, c,19);//将c的前10个值赋值给b
    printf("系统函数%s\n", b);
    mcpy(b, a, 19);
    printf("自定义函数%s", b);
    return 0;
}

admin 发表于 2020-12-24 07:39:16

指针是最重要的了,有一些常用的指针操作,需要你背下来,比如说:指针移动,指针读写等待
页: [1]
查看完整版本: C语言学习第十天 初识指针 常用系统字符串函数认识