C语言学习笔记(二)

Posted by alonealice on 2017-03-06

函数和指针

  1. 处理字符串的方法(需要string.h):strcpy(a,b):把b复制给a;strcat(a,b)。在这里需要注意的是,a,b都是数组如int[]。;strcmp(a,b):把b连到a后面;strcmp(a,b):比较a,b是否相等(a、b既可以是数组,也可以是地址);strupr(a)把字符串变大写,strlwr(a)把字符串变小写,这两个函数不是标准的函数,只能在vc里使用;strlen(a)获取字符串长度(测试sizeof(a),sizeof(a)会返回整个字符串空间的长度;time()获取时间,localtime换位当前时间,使用它时需要time.h

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    char a[10]="123";
    char b[10]="abc";
    strcpy(a,b);
    printf("a的值为%s",a);

    结果:a的值为abc

    char a[10]="123";
    char b[10]="abc";
    strcat(a,b);
    printf("a的值为%s",a);

    结果:a的值为123abc

    char a[10]="123";
    char b[10]="abc";
    printf("值为%d",strcmp(a,b));

    结果:值为-46

    char a[40]="13";
    printf("a的长度为%d,a的size为%d",strlen(a), sizeof(a));

    结果:a的长度为2,a的size为40


    time_t now;
    time(&now);
    t=localtime(&now);
    printf("%d-%d-%d",t->tm_year+1900,t->tm_mon+1,t->tm_mday);

    结果:2017-3-6
  2. C语言中方法叫函数。Main函数返回0表示执行完,返回char和int互通。

  3. 当把数据作为指针在函数中传过去时:如int a[10];function(int* a);function(a);这样相当于把a[10]的地址传过去,function可以操作a[1]等(测试传普通的int值时报错)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    int a[2]={1,4};
    function(a);
    printf("%d",a[1]);

    int function(int *a){
    a[1]=7;
    return 0;
    }

    结果:7
  4. 内部函数就是static 修饰的函数,内部函数只能在该文件内部使用,外部函数为extern修饰的函数,外部函数可以被其他的文件调用,而不用引入其头文件,但需要在文件中先声明调用的外部函数:如:extern void a();a在另一个文件中,但是也可以直接调用。(在例子中,如果main.c也有叫a的方法,编译报错)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    文件a.c:
    extern int a(){
    return 8;
    }

    main.c:

    extern int a();
    int main() {
    printf("%d",a());
    }
    结果:8
  5. 数学函数(需要有头文件<math.h>):abs(int a), labs(long a),fabs(double a)求绝对值,sin(doublea),cos(double a),tan(double a)

  6. 字符和字符串函数(ctype.h):isalpha(int a)判断是否为字母(a-z/A-Z),isdigit(int a)判断是否为数字,isalnum(int a)判断是否为字母和数字

    1
    2
    3
    4
    5
    char a='1';
    printf("%d",isalpha(a));
    char b='a';
    printf("%d",isalpha(b));
    结果:01
  7. 指针变量形式:类型说明 * 变量名;指针变量的赋值:&a 如:int a=4;int * p=&a(int * p;p=&a);表示把a的地址指给p(定义完指针后赋值不需要*)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    int a=1;
    int *p=&a;
    int *t=a;
    printf("%d\n",p);
    printf("%d",t);

    结果:
    -450497048
    123
  8. int指针,输入char类型scanf(“%c”,p),输出时为char类型的值

    1
    2
    3
    4
    5
    6
    int *t;
    scanf("%c",t);
    printf("%d",*t);
    结果:
    A
    65
  9. *变量表示的是指针变量所指向的值,是取值,&变量是表示变量的地址,&是取地址,两者叠加则效果叠加,如&则是先去取地址在去取值

  10. 指针加减表示地址加减,int类型地址+1,地址进4;当把数组a的首个元素赋值给指针时,就相当于把整个数组赋值给一样。数组赋值指针:int *p;int a[5];p=a(不需要&);p+n表示数组的第n个元素;p++表示指针移到下个数据;p++表示指针的地址移到下个数据,这些都是数组时才行

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    int a[5]={1,2,3,4,5};
    int *p;
    p=a;
    printf("%d\n",*(p+1));
    p++;
    printf("%d\n",p[0]);
    (*p)++;
    printf("%d\n",p[0]);

    结果:
    2
    2
    3
  11. 指针是二维数组时,(p+n)+m,表示a[n][m]的数据的指针,数据则为*((p+n)+m),无论几维,(p+n)等价于a[n]

  12. 指向指针的指针:类型标识符 ** 指针变量名如:int ** a,等同于int *(*p)

  13. C语言中实参变量和形参变量之间的数据传递是单向的值传递,传递指针变量也是如此,但可以改变指针变量所指向的变量的值