ポインタ、逆参照、ポインタ配列と配列ポインタの違い、配列名と&配列名の違い

1.ポインターとは何ですか?

(1)ポインターは変数であり、アドレスを格納するために使用される変数(ポインターはアドレスです)
(2)ポインターのサイズは固定されています4/8バイト(32ビットプラットフォーム/ 64ビットプラットフォーム) aは通常の整数変数です。 pは、変数aのアドレスを格納するために使用されるポインター変数です。
     eg: int a = 10;  //在内存中开辟一块空间
           int * p = &a;//对变量a取出它的地址
                  //将a的地址存放在p变量中,p就是一个指针变量

2.ポインタの逆参照

「逆参照」:「*」の機能は、ポインタが指す変数の値を参照することであり、引用符の機能は、変数のアドレスを参照することです。
                               eg: int a = 10;
    int* p = &a;
    *p = 5;//这就是一个解引用

ここに写真の説明を挿入

3.ポインター配列と配列ポインター

ポインタ配列:は配列であり、+ 1に型のサイズを加えたものです。
例:int * arr [10]
配列ポインタ:はポインタであり、+ 1に加えて配列のサイズです。
例:int(* arr)[10]

4.アレイ名と&アレイ名

int arr[20];
arrは配列名であり、配列名は配列の最初の要素のアドレスを表します。
特殊なケース:sizeof(arr)は配列全体のサイズを表し、
arrは配列のアドレス(配列ポインター)を表します。

5.ポインタと配列サイズに関する質問の例

例1.次のコードの出力を見つけます

#include<stdio.h>
int main()
{
    
    
	int a[] = {
    
     1, 2, 3, 4 };
	printf("%d\n", sizeof(a));//16
	printf("%d\n", sizeof(a + 0));//4首元素地址加减之后代表数组里元素的地址
	printf("%d\n", sizeof(*a));//4首元素的地址解引用代表首元素
	printf("%d\n", sizeof(a + 1));//4
	printf("%d\n", sizeof(a[1]));//4
	printf("%d\n", sizeof(&a));//4数组指针
	printf("%d\n", sizeof(*&a));//16数组指针解引用是一个数组
	printf("%d\n", sizeof(&a + 1));//4
	printf("%d\n", sizeof(&a[0]));//4
	printf("%d\n", sizeof(&a[0] + 1));//4
	return 0;
}

ここに写真の説明を挿入

例2.次のコードの出力を見つけます

#include<stdio.h>
int main()
{
    
    
	char arr[] = {
    
     'a', 'b', 'c', 'd', 'e', 'f' };
	printf("%d\n", sizeof(arr));//6
	printf("%d\n", sizeof(arr + 0));//4,首元素地址是一个char*
	printf("%d\n", sizeof(*arr));//1,首元素地址char*解引用char
	printf("%d\n", sizeof(arr[1]));//1
	printf("%d\n", sizeof(&arr));//4
	printf("%d\n", sizeof(&arr + 1));//4
	printf("%d\n", sizeof(&arr[0] + 1));//4首元素地址char*加1还是char*
	return 0;
}

ここに写真の説明を挿入

例3.次のコードの出力を見つけます

#include<stdio.h>
int main()
{
    
    
	char p[] = "abcdef";
	printf("%d\n", sizeof(p));//7
	printf("%d\n", sizeof(p + 1));//4
	printf("%d\n", sizeof(*p));//1
	printf("%d\n", sizeof(p[0]));//1
	printf("%d\n", sizeof(&p));//4
	printf("%d\n", sizeof(&p + 1));//4
	printf("%d\n", sizeof(&p[0] + 1));//4
	return 0;
}

ここに写真の説明を挿入

例4.次のコードの出力を見つけます

#include<stdio.h>
int main()
{
    
    
	char *p = "abcdef";
	printf("%d\n", sizeof(p));//4,是一个指针
	printf("%d\n", sizeof(p + 1));//4,char*
	printf("%d\n", sizeof(*p));//1,char
	printf("%d\n", sizeof(p[0]));//1
	printf("%d\n", sizeof(&p));//4,//char*取地址char**
	printf("%d\n", sizeof(&p + 1));//4
	printf("%d\n", sizeof(&p[0] + 1));//4,char取地址char*
	return 0;
}

ここに写真の説明を挿入

6.ポインタと配列のオープンスペースの例

#include <stdio.h>
int main()
{
    
    
  char str1[] = "hello bit.";
  char str2[] = "hello bit.";
  char *str3 = "hello bit.";
  char *str4 = "hello bit.";
  if(str1 ==str2)
printf("str1 and str2 are same\n");
  else
printf("str1 and str2 are not same\n");
  
  if(str3 ==str4)
printf("str3 and str4 are same\n");
  else
printf("str3 and str4 are not same\n");
  
  return 0;
}

ここに写真の説明を挿入
ここに写真の説明を挿入

おすすめ

転載: blog.csdn.net/weixin_50886514/article/details/111748313