Programação em C - Exercícios Avançados com Arrays

  1. Vetores de Inteiros

  1. Vetores de Caracteres

  1. Matrizes Bidimensionais

  1. 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;
}


Tags: C programação Arrays ponteiros matrizes

Publicado em 7-29 05:40