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?
- Um ponteiro é o número da menor unidade na memória, ou seja, o endereço
- 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;
}
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;
}
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;
}
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
- ponteiro não foi inicializado
- ponteiro fora dos limites de acesso
- 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;
}
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;
}
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
- inicialização do ponteiro
- Ponteiro cuidadoso fora dos limites
- O ponteiro aponta para o espaço a ser liberado e define NULL no tempo
- Evite retornar o endereço de uma variável local
- 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;
}
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;
}