C言語はポインター配列を使用して配列にアクセスします(ポインター配列と配列)

1. 文字配列と文字ポインタ配列を定義する

 	char str[32]={
    
    };
    char str1[32]={
    
    };
    char str2[32]={
    
    };
    char *sensordata[32];

個人的な理解: 文字配列は第 1 レベルのポインターであり、ポインター配列は第 2 レベルのポインターであり、文字配列のアドレスまたは第 1 レベルのポインターのアドレスを指します。

2. ポインタ データのベース アドレスとポインタのポインティングを出力します。

	printf("--------------指针数组的基地址-------------\n");
    printf("sensordata[0]的地址: %p\n",&sensordata[0]);
    printf("sensordata[1]的地址: %p\n",&sensordata[1]);
    printf("sensordata[2]的地址: %p\n",&sensordata[2]);

	printf("\n--------------指针数组的下标指向-------------\n");
    printf("sensordata[0]的地址: %p\n",sensordata[0]);
    printf("sensordata[1]的地址: %p\n",sensordata[1]);
    printf("sensordata[2]的地址: %p\n",sensordata[2]);

出力結果:
-------------- ポインタ配列のベースアドレス-------------
sensordata[0] のアドレス: 0x7ffcbe058c10
sensordata[1] のアドレス: 0x7ffcbe058c18
センサーデータのアドレス[2]: 0x7ffcbe058c20

-------------- ポインター配列の添字は、-------------
センサーデータのアドレス[0]: 0x7ffcbe058d10
センサーデータのアドレス[1]: 0x3
sensordata [2]のアドレス: 0x7ffcbe058d00

  • このことから、ポインタ配列のベースアドレスも揃っており、添え字の差が0x08になっていることが分かります。
  • ポインター配列に格納されているポインターは、不確かでランダムなポインターを指しており、ポインター配列が指す空間のサイズを知ることは不可能です。

3. ポインタ配列の添え字が文字配列を指し、文字配列の内容が整形される

//指针数组的下标指向到数组
    sensordata[0]=str;
    sensordata[1]=str1;
    sensordata[2]=str2;
    
    //格式化数组的内容,sprintf是不安全的函数,会导致缓存区溢出
    sprintf(str,"airH:%.2f ",76.83);
    sprintf(str1,"airT:%.2f ",26.50);
    sprintf(str2,"ill:%d ",356);
    
    printf("\n--------------打印数组的内容-------------\n");
    printf("str0的数据:  %s\n",str);
    printf("str1的数据:  %s\n",str1);
    printf("str2的数据:  %s\n",str2);
    
    printf("\n--------------打印指针数组下标指向的内容-------------\n");
    printf("sensordata[0]的数据: %s\n",sensordata[0]);
    printf("sensordata[1]的数据: %s\n",sensordata[1]);
    printf("sensordata[2]的数据: %s\n",sensordata[2]);

実行中の効果:
--------------配列の内容を出力します--------------
Str0 データ: airH: 76.83
str1 データ: airT: 26.50
str2 データ: 病気: 356

-------------- ポインタ配列の添え字が指す内容を出力 --------------
data of sensordata[0]: airH: 76.83
of sensordata[1] データ: airT: 26.50
sensordata[2] データ: ill: 356

  • ポインター配列の添え字は文字配列を指し、ポインター配列のポインターを決定します。
  • sprintf を使用して文字配列のコンテンツをフォーマットします。フォーマットされたデータは文字データの長さを超えることはできません。そうしないと、メモリ オーバーフローが発生します。
  • ポインター配列の添え字は文字配列を指しているため、配列のデータは添え字から直接取得できます。

4. 文字配列のベースアドレスとポインタ配列のポインタを表示

printf("\n--------------数组的基地址-------------\n");
    printf("str的地址:  %p\n",str);
    printf("str1的地址:  %p\n",str1);
    printf("str2的地址:  %p\n",str2);
    
    printf("\n--------------指针数组的指向的地址-------------\n");
    printf("sensordata[0]的地址: %p\n",sensordata[0]);
    printf("sensordata[1]的地址: %p\n",sensordata[1]);
    printf("sensordata[2]的地址: %p\n",sensordata[2]);

操作効果:
--------------配列のベースアドレス--------------
str のアドレス: 0x7ffcbe058d10
str1 のアドレス: 0x7ffcbe058d30
str2 のアドレス: 0x7ffcbe058d50

-------------- ポインタ配列が指すアドレス --------------
sensordata[0] のアドレス: 0x7ffcbe058d10
sensordata[1] のアドレス: 0x7ffcbe058d30
sensordata [2] のアドレス: 0x7ffcbe058d50
ポインター配列内のポインターが文字配列と同じベース アドレスを指していることがわかります。これにより、ポインター データを配列に格納したり、配列から取得したりできます。

5. 完全なテスト コードと効果の表示

//gcc 7.4.0

#include  <stdio.h>
#include <string.h>

int main(void)
{
    
    
    char str[32]={
    
    };
    char str1[32]={
    
    };
    char str2[32]={
    
    };
    char *sensordata[32];
    
    printf("--------------指针数组的基地址-------------\n");
    printf("sensordata[0]的地址: %p\n",&sensordata[0]);
    printf("sensordata[1]的地址: %p\n",&sensordata[1]);
    printf("sensordata[2]的地址: %p\n",&sensordata[2]);
    
    printf("\n--------------指针数组的下标指向-------------\n");
    printf("sensordata[0]的地址: %p\n",sensordata[0]);
    printf("sensordata[1]的地址: %p\n",sensordata[1]);
    printf("sensordata[2]的地址: %p\n",sensordata[2]);
    
    //指针数组的下标指向到数组
    sensordata[0]=str;
    sensordata[1]=str1;
    sensordata[2]=str2;
    
    //格式化数组的内容,sprintf是不安全的函数,会导致缓存区溢出
    sprintf(str,"airH:%.2f ",76.83);
    sprintf(str1,"airT:%.2f ",26.50);
    sprintf(str2,"ill:%d ",356);
    
    printf("\n--------------打印数组的内容-------------\n");
    printf("str0的数据:  %s\n",str);
    printf("str1的数据:  %s\n",str1);
    printf("str2的数据:  %s\n",str2);
    
    printf("\n--------------打印指针数组下标指向的内容-------------\n");
    printf("sensordata[0]的数据: %s\n",sensordata[0]);
    printf("sensordata[1]的数据: %s\n",sensordata[1]);
    printf("sensordata[2]的数据: %s\n",sensordata[2]);
    
    
    printf("\n--------------数组的基地址-------------\n");
    printf("str的地址:  %p\n",str);
    printf("str1的地址:  %p\n",str1);
    printf("str2的地址:  %p\n",str2);
    
    printf("\n--------------指针数组的指向的地址-------------\n");
    printf("sensordata[0]的地址: %p\n",sensordata[0]);
    printf("sensordata[1]的地址: %p\n",sensordata[1]);
    printf("sensordata[2]的地址: %p\n",sensordata[2]);
    printf("sensordata的数据: %s\n",sensordata);
    
    return 0;
}
Compilation time: 0.44 sec, absolute running time: 0.15 sec, cpu time: 0 sec, memory peak: 5 Mb, absolute service time: 0,69 sec
--------------指针数组的基地址-------------
sensordata[0]的地址: 0x7ffcbe058c10
sensordata[1]的地址: 0x7ffcbe058c18
sensordata[2]的地址: 0x7ffcbe058c20

--------------指针数组的下标指向-------------
sensordata[0]的地址: 0x7ffcbe058d10
sensordata[1]的地址: 0x3
sensordata[2]的地址: 0x7ffcbe058d00

--------------打印数组的内容-------------
str0的数据:  airH:76.83 
str1的数据:  airT:26.50 
str2的数据:  ill:356 

--------------打印指针数组下标指向的内容-------------
sensordata[0]的数据: airH:76.83 
sensordata[1]的数据: airT:26.50 
sensordata[2]的数据: ill:356 

--------------数组的基地址-------------
str的地址:  0x7ffcbe058d10
str1的地址:  0x7ffcbe058d30
str2的地址:  0x7ffcbe058d50

--------------指针数组的指向的地址-------------
sensordata[0]的地址: 0x7ffcbe058d10
sensordata[1]的地址: 0x7ffcbe058d30
sensordata[2]的地址: 0x7ffcbe058d50
sensordata的数据: ���

同時に、オンライン コンパイラを使用してWeb ページで直接ケースをテストすることをお勧めします。

おすすめ

転載: blog.csdn.net/a6662580/article/details/124381655