《征服C指针完整版》学习笔记

指针是一种保存变量地址的变量,在c中频繁地使用。
指针类型既存在指针类型的变量,也存在指针类型的值,指针类型的值,实际上指的就是内存的地址。

int *hoge_p

编译器可以记住“hoge_p”是指向int的指针,所以在hoge_p前面添加,就能够通过指针间接取值。
指针运算是针对指针进行整数加减运算,以及指针之间进行减法运算的功能,一个指向非数组对象的指针,和指向只包含一个元素(类型和前者相同的)的数组的第一个元素的指针,具有相同的意义。指针运算的特性,在C语言中,对指针进行加1运算,地址的值会增加当前指针所指向数据类型的长度。若环境中int类型的长度为4,则,给地址加1,指针前进4个字节。对指针加N,等同于指针前进**当前指针指向的数据类型的长度
N**。

空指针确保它和任何的非空指针进行比较都不会相等,因此,经常作为函数发生异常时的返回值使用。
在C语言中,空字符的定义为“所有的位为0的字节称位空字符”,也就是说,空字符是值为0的字符。

利用指针输出数组各元素的值

p = &array[0];
for( i  = 0; i < 5; i++)
{
    printf("%d\n", *(p + i)); //*(p+i)和p[i]是同样的意思。
}
  • 表达式中,数组可以解读成“指向它的初始元素的指针”;
  • 在网络通讯中,数据交换程序中经常会使用一个char数组保存各种各样的数据类型的数据,我们通常将这种行为称为序列化。
  • 如果试图将数组作为函数参数进行传递,那么久传递指向数组初始元素的指针,
  • 无论如何都要将数组进行值传递的时候,建议将数组整理成结构体成员进行传递。
  • 必须要引起注意的是,int a[]和int *a具有相同的意义
  • 当今的操作系统都会给应用程序的每一个进程分配独立的“虚拟地址空间”,操作系统负责将物理内存再去分配给虚拟地址空间,同事还会对每一个内存区域设定“只读”或者“可读写”的属性。

C语言的作用域 全局变量、文件内部的静态变量、局部变量,其中,静态变量的寿命从程序运行时开始,到程序关闭时结束;自动变量的寿命到声明该变量的语句块执行结束为止;通过malloc()分配的领域的寿命到调用free()为止。

imt *p;
p = malloc(sizeof(int)); // 通过malloc申请的内存区域的地址

extern使得在其他地方定义的外部变量可以在本地可见;typedef是因为可以给编码带来便利才被归纳到存储类型修饰符中来的。函数指针,函数通过编译器解释成机器码,并且被配置在内存的某个地方的地址上。通常,这个指针指向函数的初始地址。

int (*func_p)(double); //指向函数的指针
int (*func_table[])(double); //指向函数的指针的数组
typedef char *va_list;  // va_list被定义成指向char的指针。
  • 如果需要通过函数返回值以外的方式返回值,将“指向T的指针”(如果想要返回的值的类型为T)作为参数传递给函数。
#include <stdio.h>

void func(int *a, int *b)
{
    *a = 5;
    *b =3.5;
}
int main(void)
{
    int a;
    double b;

    func("&a..%d b..%f/n",a,b );
    return 0;
}

在C语言中,数组是不能作为参数进行传递的。但是能够通过传递指向数组初始元素的指针,使得在函数内部操作数成为可能。在函数这一侧,通过array[i]这种方式,可以引用数组的内容。因为在本质上,array[i]是*(array + i)的语法糖。将数组作为参数传递:

#include <stdio.h>
void func(int *array, int size)
{
    int i;

    for (i = 0; i < size; i++)
    {
        printf ("array[%d]..%d\n", i , array[i]);
    }
}
int main()
{
    int array[] = {1,2,3,4,5};
    func (array, sizeof(array)/sizeof(int));
    return 0;
}

想要将类型T的数组作为参数进行传递,可以考虑传递“指向T的指针”,可是,作为被调用方是不知道数组的元素个数的,所以在必要的情况下,需要使用其他方式进行参数传递。
可变长数组一般情况下,C语言在编译时必须知道数组的个数,也能够使用malloc()在运行时再为数组申请必要的内存区域。

#include <stdio.h>
#include<stdlib.h>

int main (void)
{
    char buf[256];
    int size;
    int *variable_array;
    int i;

    fgets(buf, 256,stdin);
    sscanf(buf, "%d", &size);

    variable_array = malloc(sizeof(int) *size);

    for (i = 0; i < size; i++)
    {
        variable_array[i] = i;
    }
    for (i = 0; i < size; i++)
    {
        printf ("varialble_array[%d]..%d\n", i, variable_array );
    }
    return 0;
}

在需要获得类型T的可变长数组时,可使用Malloc()来动态地给“指向T的指针”分配内存区域。

头文件的写法,在写头文件的时候,必须遵守下面两个原则:
1.所有的头文件中,必须要有防止#include重复的保护;
2.所有的头文件只#include自己直接依赖的头文件。

posted @ 2021-05-27 21:23  耳神666  阅读(264)  评论(0编辑  收藏  举报