当前位置:网站首页>An understanding of & array names

An understanding of & array names

2022-07-06 00:19:00 It's Yi'an

A strange phenomenon

#include<stdio.h>

int main(void) {
	int arr[5] = { 1,2,3,4,5 };

	int(*p)[5] = &arr;

	printf("%p\n", p);    // After running, you will find that these two values are equal 
	printf("%p\n", *p);

	return 0;
}

A strange secondary pointer

#include<stdio.h>

int main(void) {
	int arr[5] = { 1,2,3,4,5 };

	int(*p)[5] = &arr;
                            // The program runs successfully , And the results are :1
	printf("%d\n", **p);    // We can know p=&arr
	printf("%d\n", **&arr); // Both are secondary pointers 
	return 0;
}

A strange explanation

      An explanation of a strange problem
      Pointer to array , The designer made this design in order to distinguish it from pointers to elements : A simple array name represents a pointer to the first element of the array , It needs to open up a separate space for storage , At the same time, the value in the array name space is immutable . If you want to represent the address of the entire array , Just above the simple array name , Improved the level , Change to secondary pointer , But don't give space alone .

        Design a rule , When addressing an array name , Is to take the address of the first level pointer . You need a variable to store it , Need a space , This is a normal secondary pointer , But there is no separate space here , Just put the array name ( First level pointer ) Occupy space as its space , At the same time, improve its level , Change to secondary pointer , Mark this pointer ( Special secondary pointer ), Make a type to mark / Represents it :type(*)[]. If you want to dereference this secondary pointer , Just lower its level , Become a normal primary pointer
        // These are just assumptions , In order to solve *p=p The problem reference comes up with a convincing explanation .

summary : The array name is a pointer constant ,& The array name is to take the address of the first level pointer , A secondary pointer , But it was given a special rule .

Some normal applications

As I understand it ,&arr Is a special secondary pointer , The type is type(*)[ ].

#include<stdio.h>

int main(void) {
	int arr[5] = { 1,2,3,4,5 };

	int(*p)[5];  // Define a pointer variable of this type 
	p= &arr;     // Give it the value of this type 

	printf("%d\n",(*p)[1]);  //*p Make it a normal first level pointer :arr
	printf("%d\n", arr[1]);  //arr: Pointer to the first element of the array 

	printf("%d\n", *(*p + 1)); 
	printf("%d\n", *(*(&arr) + 1));  //p=&arr
	printf("%d\n", *(arr + 1));		 //*p=arr
	
	printf("%d\n", arr[1]);
	
	// The results are :2
	// Is that much easier to understand 
	return 0;
}

原网站

版权声明
本文为[It's Yi'an]所创,转载请带上原文链接,感谢
https://yzsam.com/2022/02/202202140232467770.html