C语言


指针

#include 

void f(int *p);
int main(void)
{
    int i = 6;
    printf("&i=%p\n", &i);
    f(&i);
}

void f(int *p)
{
    printf("p=%p\n", p);
}

指针运算

*p++

  • 取出p所指的那个数据来,完事之后顺便把p移到下一个位置去
  • *的优先级虽然高,但没有++高
  • 常用于数组类的连续空间操作
  • 在某些CPU上,这可以直接被翻译成一条汇编指令

用指针干啥

  • 需要传入较大的数据时用作参数
  • 传入数组后对数组做操作
  • 函数返回不止一个结果
  • 需要用函数来修改不止一个变量
  • 动态申请的内存...

动态内存分配

malloc返回的是void

#include 
#include 

int main()
{
    int number;
    int *a;
    int i;
    printf("输入数量:");
    scanf("%d", &number);
    // int a[number];
    a = (int *)malloc(number * sizeof(int));
    for (i = 0; i < number; i++)
    {
        scanf("%d", &a[i]);
    }
    for (i = number - 1; i >= 0; i--)
        printf("%d ", a[i]);
    free(a);

return 0;
}

字符串变量

指针还是数组?

char *str= "hello";

char word[ ] = "hello";

  • 数组:这个字符串在这里

-作为本地变量空间自动被回收

  • 指针:这个字符串不知道在哪里

-处理参数

-动态分配空间

如果要构造一个字符串->数组

如果要处理一个字符串->指针

char*是字符串?

  • 字符串可以表达为char*的形式
  • char*不一定是字符串 --本意是指向字符的指针,可能指向的是字符的数组(就像int*一样)--这里有一个指针,这个指针指向一个字节或者一串连续的字节

只有它所指的字符数组组有结尾的0,才能说它所指的是字符串。