[Linguagem C] Explicação detalhada dos ponteiros (1)

O ponteiro é um conceito importante na linguagem C e um recurso importante da linguagem C. Usá-lo de forma correta e flexível pode tornar o programa conciso, compacto e eficiente. Todos que aprendem e usam a linguagem C devem ter uma compreensão profunda dela. Aprenda e domine ponteiros .

O que são ponteiros?

O que são ponteiros?

  1. Um ponteiro é o número da menor unidade na memória, ou seja, o endereço
  2. O ponteiro na linguagem falada geralmente se refere à variável ponteiro, que é uma variável usada para armazenar o endereço de memória

Resumo:
Um ponteiro é um endereço.

variável de ponteiro

Você pode usar & (operador de endereço) para obter o endereço inicial de memória da variável e armazenar o endereço na variável.Esta variável é uma variável de ponteiro.

#include<stdio.h>
int main()
{
    
    
	//在内存中开辟一片空间
	int a = 10;
	//用p来接收a的地址
	int* p = &a;
	*p = 20;
	printf("%d", a);
	return 0;
}

imagem.png
Calcule o tamanho de uma variável de ponteiro:

#include <stdio.h>

int main()
{
    
    
	int a = 10;
	int* p = &a;
	//计算指针的大小
	printf("%d", sizeof(p));
	return 0;
}

imagem.png
Resumir:

  • O valor da variável a pode ser alterado atribuindo um novo valor a *p.
  • As variáveis ​​de ponteiro são usadas para armazenar endereços, que identificam exclusivamente uma unidade de memória.
  • O tamanho do ponteiro é de 4 bytes em plataformas de 32 bits e 8 bytes em plataformas de 64 bits.

Ponteiros e tipos de ponteiros

Como os ponteiros são definidos

type +*
Por exemplo, defina um ponteiro do tipo int
int * a;

tipo de ponteiro

A seguir estão os tipos de ponteiros que listei

int* p = NULL;
char* pa = NULL;
short* pb = NULL;
long* pc = NULL;
float* pd = NULL;
double* pe = NULL;

Diferentes tipos de ponteiros são usados ​​para armazenar endereços de variáveis ​​de diferentes tipos.

ponteiro ± inteiro

#include <stdio.h>
//演示实例
int main()
{
    
    
 int n = 10;
 char *pc = (char*)&n;
 int *pi = &n;

 printf("%p\n", &n);
 printf("%p\n", pc);
 printf("%p\n", pc+1);
 printf("%p\n", pi);
 printf("%p\n", pi+1);
 return  0;
}

imagem.png
Pode-se ver que pc+1 moveu 1 byte para trás e pi+1 moveu 4 bytes para trás. Essas distâncias de caminhada para trás estão todas relacionadas ao tipo de ponteiro
Resumo:
O tipo de ponteiro determina quanto (distância) o ponteiro dá um passo para frente ou para trás.

ponteiro selvagem

Um ponteiro selvagem é onde o ponteiro aponta é incognoscível (aleatório, incorreto, sem restrições claras).

Causas de ponteiros selvagens

  1. ponteiro não foi inicializado
  2. ponteiro fora dos limites de acesso
  3. O espaço apontado pelo ponteiro é liberado

ponteiro não foi inicializado

código:

#include<stdio.h>

int main()
{
    
    
	int* p;
	*p = 10;//指针没有初始化,导致程序出了问题
	return 0;
}

imagem.png
Aqui o compilador relatou diretamente a causa do erro para nós. A variável local não foi inicializada. Este é um dos casos de ponteiros selvagens e não há nenhum ponteiro inicializado.

ponteiro fora dos limites de acesso

código mostra como abaixo:

#include<stdio.h>

int main()
{
    
    
	int arr[10] = {
    
     1,2,3,4,5,6,7,8,9,10 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	int* p = arr;
	for (int  i = 0; i <= sz; i++)
	{
    
    
		printf("%d ", *(p + i));
	}
	return 0;
}

imagem.png
Quando i=sz, ele ultrapassa o array arr e se torna um wild pointer, ou seja, o número impresso fica incontrolável.

O espaço apontado pelo ponteiro é liberado

código mostra como abaixo:

int* t()
{
    
    
	int a = 10;
	return &a;
}
int main()
{
    
    
	int* p = t();
	*p = 20;
	return 0;
}

O endereço da variável a só é válido na função t(). Quando o endereço de a é passado para o ponteiro p, porque a função t é liberada, o endereço do espaço da variável a é liberado, fazendo com que p se torne um ponteiro selvagem.

Como evitar ponteiros selvagens

  1. inicialização do ponteiro
  2. Ponteiro cuidadoso fora dos limites
  3. O ponteiro aponta para o espaço a ser liberado e define NULL no tempo
  4. Evite retornar o endereço de uma variável local
  5. Verifique a validade do ponteiro antes de usá-lo

aritmética de ponteiro

Ponteiro ± operação inteira

#include <stdio.h>
//演示实例
int main()
{
    
    
 int n = 10;
 char *pc = (char*)&n;
 int *pi = &n;

 printf("%p\n", &n);
 printf("%p\n", pc);
 printf("%p\n", pc+1);
 printf("%p\n", pi);
 printf("%p\n", pi+1);
 return  0;
}

imagem.png

ponteiro-ponteiro

código:

#include<stdio.h>

int main()
{
    
    
	int arr[5] = {
    
     1,2,3,4,5 };
	printf("%d ", &arr[5] - &arr[0]);//得到的是中间的元素个数
	return 0;
}

imagem.png

Acho que você gosta

Origin blog.csdn.net/weixin_63284756/article/details/130737509
Recomendado
Clasificación