当前位置:网站首页>[advanced C language] 8 written questions of pointer

[advanced C language] 8 written questions of pointer

2022-07-07 01:25:00 Muxixi

I'm Muxi Xi


 Insert picture description here

Written test questions of pointer

The meaning of array names :

  1. sizeof( Array name ), The array name here represents the entire array , It calculates the size of the entire array .
  2. & Array name , The array name here represents the entire array , It takes out the address of the entire array .
  3. In addition, all array names represent the address of the first element .

Written test question 1

#include<stdio.h>
int main()
{
    
    int a[5] = {
     1, 2, 3, 4, 5 };
    int* ptr = (int*)(&a + 1);
    printf("%d,%d", *(a + 1), *(ptr - 1));
    return 0;
}

1.&a It takes out the address of the entire array ,&a+1 Is to skip a type of int(*)[5] Array of .
2.a Not alone sizeof Inside , And the array name a There is no address symbol in front , here a Represents the address of the first element .a+1 Skip a type of int The integer of , That is, the address of the second element .
3.ptr-1 Is to skip a type of int The integer of .
4.*(a+1)–>a[1];*(ptr-1)–>ptr[-1].
 Insert picture description here
 Insert picture description here

Question 2 of the written examination

struct Test
{
    
	int Num;
	char* pcName;
	short sDate;
	char cha[2];
	short sBa[4];
}*p = (struct Test*)0x100000;
// hypothesis p  The value of is 0x100000.  What are the values of the expressions in the following table ?
// It is known that , Structure Test The variable size of type is 20 Bytes 
//86 In the environment 
int main()
{
    
	printf("%p\n", p + 0x1);//0x100000+20-->0x100014
	//p+1 Indicates skipping a structure , The size of a structure is 20 Bytes 
	printf("%p\n", (unsigned long)p + 0x1);
	//0x100000+1-->0x100001
	printf("%p\n", (unsigned int*)p + 0x1);//0x100000+4-->0x100004
	p+1 Indicates skipping a type of unsigned int The integer of , Four bytes 
	return 0;
}

 Insert picture description here

Written test question 3

#include<stdio.h>
int main()
{
    
    int a[4] = {
     1, 2, 3, 4 };
    int* ptr1 = (int*)(&a + 1);
    int* ptr2 = (int*)((int)a + 1);
    printf("%x,%x", ptr1[-1], *ptr2);
    return 0;
}

1.ptr[-1] amount to *(ptr-1)
2.&a It takes out the address of the entire array ,&a+1 Is to skip a type of int(*)[4] Array of .
3.a Not alone sizeof Inside , And the array name a There is no address symbol in front , here a Represents the address of the first element .a Forced type conversion to int,a+1 Add integers , Then forcibly convert it into a pointer , Skipped a byte , One int The type size is 4 Bytes , The data is stored in the small end , Therefore, by pointing 01 The pointer to , Yes 00. and prt2 The access right of is to access 4 Bytes , so ptr2 What I visited was 0x02000000.
 Insert picture description here
 Insert picture description here

Written test question 4

#include <stdio.h>
int main()
{
    
    int a[3][2] = {
     (0, 1), (2, 3), (4, 5) };
    int* p;
    p = a[0];
    printf("%d", p[0]);
    return 0;
}

because int a[3][2] = {(0,1),(2,3),(4,5)} It's a comma expression .

Comma expression , Is multiple expressions separated by commas .
Comma expression , From left to right . The result of the entire expression is the result of the last expression .

so int a[3][2] ={1,3,5};
a[0] Is the array name in the first row ,a[0] Represents the address of the first element , namely a[0][0] The address of ,&a[0][0].
 Insert picture description here

Written test question five

#include<stdio.h>
int main()
{
    
    int a[5][5];
    int(*p)[4];
    p = a;
    printf("%p,%d\n", &p[4][2] - &a[4][2], &p[4][2] - &a[4][2]);
    return 0;
}

1.p[4][2] amount to *(*(p+4)+2).
2. The two hands subtract , The result is the number of elements between two pointers .
3.%p What is printed directly is the complement , Addresses are considered unsigned integers .
 Insert picture description here
 Insert picture description here

Written test question six

#include<stdio.h>
int main()
{
    
    int aa[2][5] = {
     1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
    int* ptr1 = (int*)(&aa + 1);
    int* ptr2 = (int*)(*(aa + 1));
    printf("%d,%d", *(ptr1 - 1), *(ptr2 - 1));
    return 0;
}

1.*(aa+1) amount to aa[1], Represents the array name of the second row .
2.&aa It takes out the address of the entire array ,&aa+1 Is to skip a type of int(*)[2][5] Array of .
3.aa Not alone sizeof Inside , And the array name aa There is no address symbol in front , here aa Represents the array name of the first row ,aa+1 Represents the array name of the second row .

 Insert picture description here
 Insert picture description here

Written test question 7

#include <stdio.h>
int main()
{
    
	char* a[] = {
     "work","at","alibaba" };
	char** pa = a;
	pa++;
	printf("%s\n", *pa);
	return 0;
}

pa++ Is to skip a type of char* The pointer to .
 Insert picture description here

Written test question 8

#include<stdio.h>
int main()
{
    
	char* c[] = {
     "ENTER","NEW","POINT","FIRST" };
	char** cp[] = {
     c + 3,c + 2,c + 1,c };
	char*** cpp = cp;
	printf("%s\n", **++cpp);
	printf("%s\n", *-- * ++cpp + 3);
	printf("%s\n", *cpp[-2] + 3);
	printf("%s\n", cpp[-1][-1] + 1);
	return 0;
}

1.*cpp[-2] amount to *(*(cpp-2)).
2.cpp[-1][-1] amount to *(*(cpp-1)-1)
 Insert picture description here
printf(“%s\n”, **++cpp); The result is :
 Insert picture description here
printf(“%s\n”, *-- * ++cpp + 3); The result is :
 Insert picture description here
printf(“%s\n”, *cpp[-2] + 3); The result is :
 Insert picture description here
printf(“%s\n”, cpp[-1][-1] + 1); The result is :
 Insert picture description here
 Insert picture description here

At the end

 Insert picture description here

Then the notes of pointer pen test questions are over here , What doubts or feelings are wrong , Leave a comment in the comments section .
But the road ahead , Not to lose time !

原网站

版权声明
本文为[Muxixi]所创,转载请带上原文链接,感谢
https://yzsam.com/2022/188/202207061737535059.html