指針,解引用,指針數組和數組指針的區別,數組名和&數組名的區別

1.指針是什麼?

(1)指針就是個變量,用來存放地址的變量(指針就是地址)
(2)指針的大小是固定的4/8個字節(32位平臺/64位平臺)
     eg: int a = 10;  //在內存中開闢一塊空間
           int * p = &a;//對變量a取出它的地址
                  //將a的地址存放在p變量中,p就是一個指針變量


a是普通的整形變量,p就是一個指針變量,用來存儲變量a的地址


2.指針的解引用

“解引用”:" * "的作用是引用指針指向變量的值,引用其的作用就是引用該變量的地址
                               eg: int a = 10;
    int* p = &a;
    *p = 5;//這就是一個解引用


在這裏插入圖片描述

3.指針數組和數組指針

指針數組:是一個數組,+1加一個類型的大小
eg:int* arr[10]
數組指針:是一個指針,+1加一個數組的大小
eg: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;
}

在這裏插入圖片描述
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章