C言語ポインタの理解

1つ:ポインタとは

1. 指针是**变量**
2. 指针是用来存放地址的变量(存放变量的地址),用来表示指定内存空间的地址。
3. 地址的大小是**固定**的:占4个字节(32位系统)或者8个字节(64位系统)
4. 指针**存在类型**,如整型指针、字符指针等,其类型决定了指针加减运算时移动的步长大小。同时指针可以进行**算术、关系运算**。

2:文字ポインタ

    字符指针:是指存放char类型变量的地址的变量,称为字符指针。

文字ポインタは、次の3つの方法で表すことができます。
方法1:

char  a = 'c';
char* p = &a;   // 把字符变量a的地址赋值给字符指针p
*p = 'd';            // 修改字符指针p所指向内存空间存储的内容
printf("%c\n", *p);  // 输出:d

方法2:

char arr[] = "abcdef";  // arr数组的长度为7,不是6
char *p = arr;    // 数组名就是数组首元素的地址
printf("%c\n", *p);  // 解引用后得到字符a                                输出:a
printf("%s\n", p);   // 输出字符指针p所指向的字符串               输出:abcdef
printf("%s\n", arr); // 数组名就是首元素的地址,故与p相同:输出:abcdef

方法3:

char *p = "abcdef"; // 该字符串是一个常量字符串,且把该字符串的首字符的地址放到字符指针p中
// 该字符串在内存中的表示是:a b c d e f \0,把该字符串的地址存到字符变量p中,该地址为字符串首字符的地址。
printf("%c\n", *p);  // p指向的是字符串首字符的地址,即'a'的地址,则解引用后,得到字符'a'; 输出:a
printf("%s\n", p);   // 把字符指针p所指向的字符串给打印出来, 输出:abcdef

2.1定数文字列

  1. 定数文字列の内容は変更できません。
  2. メモリにはコピーが1つしかなく、複数の文字ポインタが同じ文字列を指している場合、これらのポインタに格納されているアドレスは同じです。
  3. 文字ポインタに割り当てるときは、最初の文字のアドレス(アドレス)を文字ポインタに割り当てます(渡します)。
    次の例のように:

    int main()
    {
    char* p = "abcdef"; // 该字符串是一个常量字符串,且把该字符串的首字符的地址放到字符指针p中
    *p = '1';
    printf("%s\n", p);   // 把字符指针p所指向的字符串给打印出来, 输出:abcdef
    return 0;
    }

    C言語ポインタの理解
    C言語ポインタの理解
    C言語ポインタの理解
    C言語ポインタの理解
    したがって、正しい書き方は次のとおりです。

    int main()
    {
    const char* p = "abcdef"; // 
    *p = '1';                          // 此时编译都过不去的。
    printf("%s\n", p);   // 把字符指针p所指向的字符串给打印出来, 输出:abcdef
    return 0;
    }

    例2:

    int main()
    {
    // 对于常量字符串,C会把其存储到单独的一个内存区域,当多个指针同时指向同一个字符串时,它们指向的是同一块内存
    // 但是用相同的常量字符串去初始化不同的数组时,就会指向不同的内存块。
    char arr1[] = "hello world"; // 将字符串放到数组arr1中,不是常量字符串
    char arr2[] = "hello world"; // 
    const char* p1 = "hello world"; // 为常量字符串
    const char* p2 = "hello world"; // 为常量字符串,和上面的为同一个,为了节省内存空间,在内存中只储存一份
    
    if (arr1 == arr2)
        printf("arr1 == arr2\n"); 
    else
        printf("arr1 != arr2\n");// 执行
    if (p1 == p2)
        printf("p1 == p2\n");// 执行
    else
        printf("p1 != p2\n");
    printf("arr1 and arr2's address = %p and %p\n", arr1, arr2); // 
    printf("p1   and p2's   address = %p and %p\n", p1, p2);
    return 0;
    }

    C言語ポインタの理解
    :2つのテクニカルフォーラムWebサイト:
    segmentfault.com(中国語のWebサイト、セグメンテーション違反)
    stackoverflow.com(外国のWebサイト、スタックオーバーフローエラー)

    3:ポインタ配列

    ポインタ配列:ポインタを格納する配列を指します。これは配列であり、配列の要素はアドレスです。
    といった:

    int arr1[5] = {0}; // 整型数组,因为数组的元素是整型
    char arr2[5] = {0}; // 字符数组,因为数组的元素是字符类型
    int* arr3[3];           // 存放整型指针的数组----指针数组
    char* arr4[4];        // 存放字符指针的数组----指针数组

    ポインター配列を理解する例(ただし、ポインター配列の実際の使用ではありません):

    int main()
    {
    int  a = 10;
    int  b = 20;
    int  c = 30;
    int* arr[3] = { &a, &b, &c }; // arr就是一个指针数组,且为一个整型指针数组,因为存放的是整型变量的地址。
    int i = 0;
    for (i = 0; i < 3; i++)
    {
        printf("%d\t", *(arr[i]));// 10 20 30
    }
    return 0;
    }

    ポインタ配列の適用:

    int main()
    {
    int arr1[] = { 1,2,3,4,5 };
    int arr2[] = { 6,7,8,9,10};
    int arr3[] = { 11,12,13,14,15 };
    int* parr[3] = { arr1, arr2, arr3 };
    int i, j;
    for (i = 0; i < 3; i++)
    {
        for (j = 0; j < 5; j++)
        {
            // 以下三种写法都对:都可以一次打印每个数组的元素
            // 找到数组的每个元素:parr[i],其中每一个元素是一个数组(arr1..3)
            // +j表示找到指定数组中第j个元素的地址,在对其进行解引用,则找到对应的值
            //printf("%d\t", *(parr[i] + j)); // 得到第i行的地址后向后偏移j的地址,再进行解引用
    
            //printf("%d\t", parr[i][j]);
            printf("%d\t", *(*(parr+i)+j));
        }
        printf("\n");
    }
    return 0;
    }

    C言語ポインタの理解

4:配列ポインタ

配列ポインタ:ポインタであり、ポインタは配列を指します

おすすめ

転載: blog.51cto.com/15132389/2674931