当前位置:网站首页>Analyze "C language" [advanced] paid knowledge [II]

Analyze "C language" [advanced] paid knowledge [II]

2022-07-07 01:49:00 Choice~

Calculate the length

sizeof:

Calculated variables , Array , The size of the type , Unit is byte ( The operator )

#include<stdio.h>
int main()
{
    
	//sizeof( Array name )- The array name represents the name of the entire array - It calculates the size of the entire array 
	//& Array name  -  The array name represents the entire array , It takes out the address of the entire array 
	// besides , All array names are the address of the first element of the array 

	// Shape array 
	int a[]={
    1,2,3,4};
	printf("%d\n",sizeof(a));//16
	printf("%d\n",sizeof(a+0));//4/8 a+0 Is the address of the first element ,sizeof(a+0) It calculates the size of the address 
	printf("%d\n",sizeof(*a));//4 *a Is the first element of the array ,sizoef(*a) It calculates the size of the first element 
	printf("%d\n",sizeof(a+1));//4/8 a+1 Is the address of the second element ,sizeof(a+1) The size of the calculated address 
	printf("%d\n",sizeof(a[1]));//4  It calculates the size of the second element 

	printf("%d\n",sizeof(&a));// 4/8 [email protected] Although the address of the array , But it's also the address ,sizeof(&a) It calculates the size of an address 
	printf("%d\n",sizeof(*&a));//16 - Calculate the size of the array 
	//&a -- int(*p)[4]=&a;
	printf("%d\n",sizeof(&a+1));//4/8 - &a+1-- The address of the space behind the array 
	printf("%d\n",sizeof(&a[0]));//4/8
	printf("%d\n",sizeof(&a[0]+1));//4/8

	// A character array 
	char arr[]={
    'a','b','c','d','e','f'};
	printf("%d\n",sizeof(arr));//6
	printf("%d\n",sizeof(arr+0));//4/8 - Pointer size  - The address indicated by the pointer is 4 A byte address 
	printf("%d\n",sizeof(*arr));//1
	printf("%d\n",sizeof(arr[1]));//1
	printf("%d\n",sizeof(&arr));//4/8
	printf("%d\n",sizeof(&arr +1));//4/8
	printf("%d\n",sizeof(&arr[0]+1));//4/8
	return 0;
}

 Please add a picture description
 Please add a picture description

#include<stdio.h>
int main()
{
    
	//sizeof( Array name )- The array name represents the name of the entire array - It calculates the size of the entire array 
	//& Array name  -  The array name represents the entire array , It takes out the address of the entire array 
	// besides , All array names are the address of the first element of the array 

	// Shape array 
	int a[]={
    1,2,3,4};
	printf("%d\n",sizeof(a));//16
	printf("%d\n",sizeof(a+0));//4/8 a+0 Is the address of the first element ,sizeof(a+0) It calculates the size of the address 
	printf("%d\n",sizeof(*a));//4 *a Is the first element of the array ,sizoef(*a) It calculates the size of the first element 
	printf("%d\n",sizeof(a+1));//4/8 a+1 Is the address of the second element ,sizeof(a+1) The size of the calculated address 
	printf("%d\n",sizeof(a[1]));//4  It calculates the size of the second element 


	printf("%d\n",sizeof(&a));// 4/8 [email protected] Although the address of the array , But it's also the address ,sizeof(&a) It calculates the size of an address 
	printf("%d\n",sizeof(*&a));//16 - Calculate the size of the array 
	//&a -- int(*p)[4]=&a;
	printf("%d\n",sizeof(&a+1));//4/8 - &a+1-- The address of the space behind the array 
	printf("%d\n",sizeof(&a[0]));//4/8
	printf("%d\n",sizeof(&a[0]+1));//4/8


	// A character array 

	char arr[]={
    'a','b','c','d','e','f'};
	printf("%d\n",sizeof(arr));//6
	printf("%d\n",sizeof(arr+0));//4/8 - Pointer size  - The address indicated by the pointer is 4 A byte address 
	printf("%d\n",sizeof(*arr));//1
	printf("%d\n",sizeof(arr[1]));//1
	printf("%d\n",sizeof(&arr));//4/8
	printf("%d\n",sizeof(&arr +1));//4/8
	printf("%d\n",sizeof(&arr[0]+1));//4/8

	return 0;
}

 Please add a picture description
 Please add a picture description


int main()
{
    
	int a[3][4] = {
     0 };

	printf("%d\n", sizeof(a));//48 = 3*4*sizeof(int)
	printf("%d\n", sizeof(a[0][0]));//4 - a[0][0] -  Is the first element in the first line 
	printf("%d\n", sizeof(a[0]));//16
	printf("%d\n", sizeof(a[0] + 1));//4  explain :a[0] As an array name, it is not placed separately in sizeof Inside ,
									// I didn't take the address , therefore a[0] It's the first address on the first line 
									//a[0]+1, Is the address of the second element in the first line 
	printf("%d\n", sizeof(*(a[0] + 1)));//4 -  explain :*(a[0] + 1) Is the second element in the first line 

	printf("%d\n", sizeof(a + 1));//4 -  explain :a Is the array name of a two-dimensional array , No address 
	// It's not alone sizeof Inside , therefore a It represents the address of the first element of the two-dimensional array , namely : The address on the first line 
	//a + 1 Is the address of the second row of the two-dimensional array 

	printf("%d\n", sizeof(*(a + 1)));//16  explain :a+1 Is the address on the second line , therefore *(a+1) It means the second line 
	// So the calculation is the second 2 The size of the line 

	printf("%d\n", sizeof(&a[0] + 1));//4  explain :a[0] Is the array name in the first row ,
	//&a[0] What you take out is the address in the first line ,&a[0]+1  It's the address on the second line 

	printf("%d\n", sizeof(*(&a[0] + 1)));//&a[0]+1  It's the address on the second line 
	//*(&a[0]+1)  The second line , So the address of the second line of the calculation 

	printf("%d\n", sizeof(*a));//16  explain :a Array name as a two-dimensional array , No, &, Not alone in sizeof Inside 
	//a Is the address of the first element , That is, the address on the first line , therefore *a It's the first line , It calculates the size of the first line 

	printf("%d\n", sizeof(a[3]));//16  explain :a[3] It's actually the array name on the fourth line ( If any )
	// So it doesn't really exist , You can also calculate the size by type 
	printf("%d\n", sizeof(a[-1]));

	return 0;
}

strlen

strlen: Is to find the length of the string , Only for string length ( Library function - Use the reference header file )

#include<stdio.h>
#include<string.h>
int main()
{
    
	char arr[]={
    'a','b','c','d','e','f'};

	printf("%d\n",strlen(arr));// Random value  - encounter ‘\0’ end 
	printf("%d\n",strlen(arr+0));// Random value 
	//printf("%d\n",strlen(*arr));//err
	//printf("%d\n",strlen(arr[1]));//err
	printf("%d\n",strlen(&arr));// Random value 
	printf("%d\n",strlen(&arr+1));// Random value - 6
	printf("%d\n",strlen(&arr[0]+1));// Random value - 1

	return 0;
}

because strlen Just find the length of the string , Random values are generated for characters

The pointer

The size of the pointer variable

32 Bit computer system The integer pointer accounts for 4 Bytes , The actual parameter is passed to the character parameter 4 Bytes

void test1 (char ch)//char *ch
{

 printf("%d\n",sizeof(ch));//4 Bytes , Because the first address of the character is passed in , That's the pointer char *ch , The length of the pointer is 4, therefore char The passed parameter of character type is the passed pointer byte 

}
char arr[10]={0};
printf(“%d\n”,sizeof(char));//10
test1(ch);// The first element of the character array

  • As long as 32 Bit operating environment , No matter what type , All are 4 Bytes

 Please add a picture description

  • stay 64 Bit environment

 Please add a picture description

Declaration pointer

int* a,b,c;
In fact, only variables are declared a It's the pointer type
If you want to declare three pointers :
int *a ,*b, *c;

 Please add a picture description

Structure

  1. ​ . : Structural variable . member

  2. ​ -> : Structure pointer -> member

     Please add a picture description

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

struct Book
{
    
	char book_name[20];
	int price;
};

int main()
{
    
	struct Book b={
    "c Language programming ",55};
	struct Book* p = &b;
	// Change price 
	(*p).price=19;// Equate to p->price
	printf("%d\n",b.price);

	// Change book title 
	// Use library function strings to copy functions 
	//b1.name="c++";//error
	strcpy(p->book_name,"C++");// because book_name Is a character array name , The array itself is an address , and price It's a variable. 
	printf("%s\n",(*p).book_name);

	printf("%s\t %d\n",p->book_name,p->price);
	printf("%s\t%d\n",(*p).book_name,(*p).price);//(*p).book_name,(*p).price Equate to p->book_name,p->price
	printf("%s\n",b.book_name);
	printf("%d\n",b.price);

	return 0;
}

Array element address

1.sizeof( Array name ), Calculate the size of the entire array ,sizeof Put a separate array name inside , The array name represents the entire array
2.& Array name , The address of the extracted array .& Array name , The array name represents the entire array .

In addition to this 1,2 Except for two cases , All array names represent the address of the first element of the array

 Please add a picture description

character string

String comparison

stract(str1,str1); //err, Because I will add that I will ’\0’ overwrite , No, it hasn't been ’\0’ Go back and forth

 Please add a picture description

You can't compare two strings to make them equal , You should use the string
example :

char password[20]={
    0};
sacnf("%s",password);
//if(pwssword == "123456")//err
if(strcmp(password,"123456")==0)
printf(" identical ");

Copy of string

Copy the string to the destination address , Debugging we found , encounter ’\0’ End copy

// Change book title 
	// Use library function strings to copy functions 
	//b1.name="c++";//error
	strcpy(p->book_name,"C++");// because book_name Is a character array name , The array itself is an address 

 Please add a picture description

When the copy is not ’\0’ end , Program running error

 Please add a picture description

  • The source string must be in ‘\0’ end .
  • In the source string ‘\0’ Copy to target space .
  • The target space has to be large enough , To ensure that the source string can be stored .
  • The target space has to be variable .
  • Learn to simulate .
    Be careful : The source character must be a character array or a pointer to an array of dynamically allocated memory , Cannot use string constants !

Structure

Memory alignment

On the whole :

Memory alignment of structures is a way of trading space for time .
rise .

S1 and S2 The type of members as like as two peas , however S1 and S2 There are some differences in the amount of space taken up .

// for example :
struct S1
{
    
char c1;
int i;
char c2;
};
struct S2
{
    
char c1;
char c2;
int i;
};

Change the default alignment number

We met before #pragma This preprocessing instruction , Here we use again , We can change our default alignment number .

// for example :
struct S1
{
    
 char c1;
 int i;
 char c2;
};
struct S2
{
    
 char c1;
 char c2;
 int i;
};
#include <stdio.h>
#pragma pack(8)// Set the default alignment number to 8
struct S1
{
    
 char c1;
 int i;
 char c2;
};

#pragma pack()// Unset the default number of alignments , Restore to default 
#pragma pack(1)// Set the default alignment number to 1
struct S2
{
    
 char c1;
 int i;
 char c2;
};
#pragma pack()// Unset the default number of alignments , Restore to default 
int main()
{
    
    // What is the result of the output ?
    printf("%d\n", sizeof(struct S1));
    printf("%d\n", sizeof(struct S2));
原网站

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