- Vetores de Inteiros
- Vetores de Caracteres
- Matrizes Bidimensionais
- Operações Complexas com Ponteiros
---------------------------------------------------------------------------------------------------------------------------------
1. Vetores de Inteiros
#include<stdio.h>
//Compreendendo nomes de vetores
//Operações com ponteiros e significado dos tipos de ponteiros
//
// Vetor de inteiros
int main() {
int vetorInteiros[] = { 10, 20, 30, 40 };
printf("%d\n", sizeof(vetorInteiros));
//sizeof(nome do vetor), quando o nome do vetor está sozinho dentro do sizeof, ele representa todo o vetor, calculando o tamanho total em bytes
printf("%d\n", sizeof(vetorInteiros+0));
//vetorInteiros não está sozinho dentro do sizeof, nem foi usado o operador de endereço, então vetorInteiros é o endereço do primeiro elemento, vetorInteiros+0 ainda é o endereço do primeiro elemento
//como é um endereço, o tamanho é 4/8 bytes
printf("%d\n", sizeof(*vetorInteiros));
//*vetorInteiros tem vetorInteiros como endereço do primeiro elemento, *vetorInteiros é a desreferência desse endereço, encontrando o primeiro elemento
//o tamanho do primeiro elemento é 4 bytes
printf("%d\n", sizeof(vetorInteiros+1));
//aqui vetorInteiros é o endereço do primeiro elemento do vetor
//vetorInteiros+1 é o endereço do segundo elemento
//sizeof(vetorInteiros+1) é o tamanho de um endereço
printf("%d\n", sizeof(vetorInteiros[1]));
//calcula o tamanho do segundo elemento
printf("%d\n", sizeof(&vetorInteiros));
//&vetorInteiros pega o endereço do vetor, que é um endereço
printf("%d\n", sizeof(*&vetorInteiros));
//primeira forma de entendimento
//&vetorInteiros ---> int(*)[4]
//&vetorInteiros pega o endereço do nome do vetor, o tipo é int(*)[4], um ponteiro para vetor
//a desreferência de um ponteiro para vetor encontra o vetor
//*&vetorInteiros ----> vetorInteiros
//segunda forma de entendimento
//& e * se cancelam
//*&vetorInteiros ---> vetorInteiros
printf("%d\n", sizeof(&vetorInteiros+1));
//&vetorInteiros pega o endereço do vetor
//&vetorInteiros --> int(*)[4]
//&vetorInteiros+1 pula o tamanho de um vetor (com 4 elementos inteiros) a partir do endereço do vetor
//&vetorInteiros+1 ainda é um endereço, sendo 4/8 bytes
printf("%d\n", sizeof(&vetorInteiros[0]));
//&vetorInteiros[0] é o endereço do primeiro elemento
//calcula o tamanho do endereço
printf("%d\n", sizeof(&vetorInteiros[0]+1));
//&vetorInteiros[0]+1 é o endereço do segundo elemento
//o tamanho é 4/8 bytes
//&vetorInteiros[0]+1 ---> &vetorInteiros[1]
return 0;
}
2. Vetores de Caracteres
#include<stdio.h>
//Vetor de caracteres
#include<string.h>
int main() {
char* ponteiroCaracteres = "abcdef";
printf("%d\n", sizeof(ponteiroCaracteres));//4/8
printf("%d\n", sizeof(ponteiroCaracteres+1));//4/8
printf("%d\n", sizeof(*ponteiroCaracteres));//1
printf("%d\n", sizeof(ponteiroCaracteres[0]));//1
printf("%d\n", sizeof(&ponteiroCaracteres));//4/8
printf("%d\n", sizeof(&ponteiroCaracteres+1));//4/8
printf("%d\n", sizeof(&ponteiroCaracteres[0]+1));//4/8
printf("%d\n", strlen(ponteiroCaracteres));//6
printf("%d\n", strlen(ponteiroCaracteres + 1));//5
printf("%d\n", strlen(*ponteiroCaracteres));//erro
printf("%d\n", strlen(ponteiroCaracteres[0]));//erro
printf("%d\n", strlen(&ponteiroCaracteres));//valor aleatório
printf("%d\n", strlen(&ponteiroCaracteres + 1));//valor aleatório
printf("%d\n", strlen(&ponteiroCaracteres[0] + 1));//5
return 0;
}
3. Matrizes Bidimensionais
#include<stdio.h>
//Matriz bidimensional
int main() {
int matrizBidimensional[3][4] = { 0 };
printf("%d\n", sizeof(matrizBidimensional));//48
printf("%d\n", sizeof(matrizBidimensional[0][0]));//4
printf("%d\n", sizeof(matrizBidimensional[0]));
//matrizBidimensional[0] é o nome do vetor unidimensional da primeira linha, estando sozinho dentro do sizeof, matrizBidimensional[0] representa todo esse vetor unidimensional
//sizeof(matrizBidimensional[0]) calcula o tamanho da primeira linha
printf("%d\n", sizeof(matrizBidimensional[0]+1));
//matrizBidimensional[0] não está sozinho dentro do sizeof, nem foi usado o operador de endereço, então matrizBidimensional[0] representa o endereço do primeiro elemento
//que é o endereço do primeiro elemento do vetor unidimensional da primeira linha, matrizBidimensional[0]+1 é o endereço do segundo elemento da primeira linha
printf("%d\n", sizeof(*(matrizBidimensional[0]+1)));
//matrizBidimensional[0]+1 é o endereço do segundo elemento da primeira linha
//*(matrizBidimensional[0]+1) é o segundo elemento da primeira linha
printf("%d\n", sizeof(matrizBidimensional + 1));//4/8
//matrizBidimensional, embora seja o endereço da matriz bidimensional, não está sozinho dentro do sizeof, nem foi usado o operador de endereço
//matrizBidimensional representa o endereço do primeiro elemento, o primeiro elemento de uma matriz bidimensional é sua primeira linha, matrizBidimensional é o endereço da primeira linha
//matrizBidimensional+1 é o endereço da segunda linha, pulando a primeira linha
printf("%d\n", sizeof(*(matrizBidimensional + 1)));//16
//*(matrizBidimensional + 1) é a desreferência do endereço da segunda linha, pegando a segunda linha
//*(matrizBidimensional + 1) --> matrizBidimensional[1]
printf("%d\n", sizeof(&matrizBidimensional[0] + 1));//4/8
//&matrizBidimensional[0] pega o endereço do nome do vetor unidimensional da primeira linha
//&matrizBidimensional[0]+1 obtém o endereço da segunda linha
printf("%d\n", sizeof(*(&matrizBidimensional[0] + 1)));//16
printf("%d\n", sizeof(*matrizBidimensional));//16
//matrizBidimensional representa o endereço do primeiro elemento, que é o endereço da primeira linha
//*matrizBidimensional é a desreferência do endereço da primeira linha, obtendo a primeira linha
printf("%d\n", sizeof(matrizBidimensional[3]));//16
//printf("%d\n", sizeof(matrizBidimensional[0]));//16
return 0;
}
4. Operações Complexas com Ponteiros
#include<stdio.h>
int main() {
char* vetorCaracteres[] = { "enter","new","point","first" };
char** ponteiroVetor[] = { vetorCaracteres + 3,vetorCaracteres + 2,vetorCaracteres + 1,vetorCaracteres };
char*** ponteiroTriplio = ponteiroVetor;
printf("%s\n", **++ponteiroTriplio);
printf("%s\n", *-- * ++ponteiroTriplio + 3);
printf("%s\n", *ponteiroTriplio[-2]+3);
printf("%s\n", ponteiroTriplio[-1][-1]+1);
return 0;
}