Ir ao conteúdo
  • Cadastre-se

C É possível fazer o teste lógico de comparação de uma cadeia de char no while?


Ir à solução Resolvido por arfneto,

Posts recomendados

Código que funciona >

#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
#include<string.h>
int main()
{
	setlocale(LC_ALL,"portuguese");
	
	char nome_comodo[30];
	float largura, comprimento, Areacomodo, Areatotal;
	printf("Digite o nome do comodo:");
	scanf("%s", nome_comodo);
	
	while(strcmp(nome_comodo,"fim") != 0 && strcmp(nome_comodo,"FIM" ) != 0) 
	{
		printf("Digite a largura do comodo: \n");
		scanf("%f", &largura);
		printf("Digite o comprimento do comodo:\n");
		scanf("%f", &comprimento);
		system("cls");
		Areacomodo = largura * comprimento; 
		Areatotal = Areatotal + Areacomodo;
		printf("Digite o nome do comodo... digite FIM para finalizar.\n");
		scanf(" %s", nome_comodo);
	 } 
	 system("cls");
	 printf("\n\nA area total da casa é %.2f\n\n", Areatotal);
	 return(0);
}

Código que não funciona>

#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
int main()
{
	setlocale(LC_ALL,"portuguese");
	
	char nome_comodo[30];
	float largura, comprimento, Areacomodo, Areatotal;
	printf("Digite o nome do comodo:");
	scanf("%s", nome_comodo);
	
	while((nome_comodo != "fim") || (nome_comodo != "FIM" )) 
	{
		printf("Digite a largura do comodo: \n");
		scanf("%f", &largura);
		printf("Digite o comprimento do comodo:\n");
		scanf("%f", &comprimento);
		system("cls");
		Areacomodo = largura * comprimento; 
		Areatotal = Areatotal + Areacomodo;
		printf("Digite o nome do comodo... digite FIM para finalizar.\n");
		scanf(" %s", nome_comodo);
	 } 
	 system("cls");
	 printf("\n\nA area total da casa é %.2f\n\n", Areatotal);
	 return(0);
}

 

  • Amei 1
Link para o comentário
Compartilhar em outros sites

@AnonymousLPH O que você quer? Qual sua dificuldade?

Disserte sobre seu problema, imagino que você não espera que leiamos e adivinhemos o que seu programa faz e qual o problema.

Se quer ajuda, podemos ajudar, mas você tem que nos ajudar também né camarada.

 

strcmp() é uma função usada pra comparar 2 strings, você usou ela no "código que funciona", use ela que já é uma mão na roda.

  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

@Lucca Rodrigues É possível fazer o teste lógico de comparação de uma cadeia de char no while?

Funciona :

19 minutos atrás, AnonymousLPH disse:

while(strcmp(nome_comodo,"fim") != 0 && strcmp(nome_comodo,"FIM" ) != 0)

Não funciona:

20 minutos atrás, AnonymousLPH disse:

while((nome_comodo != "fim") || (nome_comodo != "FIM" ))

 

 

E mais uma dúvida: (Por que não funciona se eu troca o && por ||):

22 minutos atrás, AnonymousLPH disse:

while(strcmp(nome_comodo,"fim") != 0 && strcmp(nome_comodo,"FIM" ) != 0)  // || 

 

  • Amei 1
Link para o comentário
Compartilhar em outros sites

@AnonymousLPH    os dois códigos funcionam sim , mas o que acontece é que o primeiro foi colocado na extensão da linguagem c  , que aquele  (   .c  )   , que vem após o nome do programa ,  e o segundo também funcionará se na hora de colocar o nome do programa você colocar ( .cpp   ) , que é da linguagem c++ , e dependendo do compilador você precisa escolher qual linguagem vai usar antes de colocar o nome do programa .  e na linguagem c++ esse código poderia ser assim  :

#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
#include <iostream>
#include <cstring>
using namespace std;
int main(){
    setlocale(LC_ALL,"portuguese");
    string nome_comodo;
    //char nome_comodo[30];
    float largura, comprimento, Areacomodo, Areatotal;
    printf("Digite o nome do comodo:");
    //scanf("%s", nome_comodo);
    cin>>nome_comodo;
    while( nome_comodo != "fim" && nome_comodo != "FIM"  ){
        printf("Digite a largura do comodo: \n");
        scanf("%f", &largura);
        printf("Digite o comprimento do comodo:\n");
        scanf("%f", &comprimento);
        system("cls");
        Areacomodo = largura * comprimento;
        Areatotal = Areatotal + Areacomodo;
        printf("Digite o nome do comodo... digite FIM para finalizar.\n");
        //scanf("%s", nome_comodo);
        cin>>nome_comodo;
    }
    system("cls");
    printf("\n\nA area total da casa é %.2f\n\n", Areatotal);
    return(0);
}

 

  • Curtir 1
  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

@AnonymousLPH Você não pode comparar strings em C com == ou qualquer outro operador, o compilador não tem ideia de que se trata de uma cadeia.

Faça a comparação caractere por caractere ou use a função strcmp() que, como eu havia dito, é uma mão na roda.

Se quiser, pesquise sobre a expansão dessa tal função.

adicionado 12 minutos depois

 

7 minutos atrás, AnonymousLPH disse:

E mais uma dúvida: (Por que não funciona se eu troca o && por ||):

30 minutos atrás, AnonymousLPH disse:

while(strcmp(nome_comodo,"fim") != 0 && strcmp(nome_comodo,"FIM" ) != 0)  // || 

 

&& representa o E lógico, || representa o OU lógico, são dois operadores diferentes.

De preferência, não use como critério fim ou FIM, e se o usuário entrar com Fim, fIm, fiM, etc?

Dentro de um laço, use uma estrutura condicional para detectar se o caractere é uma letra maiúscula e, caso for, some 32 ao mesmo para convertê-lo para minúsculo.

Depois, apenas use a função strcmp() para comparar nome_comodo com a string "fim".

  • Curtir 2
  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

  • Solução
52 minutos atrás, devair1010 disse:

e o segundo também funcionará se na hora de colocar o nome do programa você colocar ( .cpp   ) , que é da linguagem c++ , e dependendo do compilador você precisa escolher qual linguagem vai usar antes de colocar o nome do programa

 

Na verdade não.

 

O determinante é a declaração:

	char nome_comodo[30];

Tanto em C quanto em C++. nome_comodo é um ponteiro para char, e assim *nome_comodo é um char. E é o que temos.

 

Em C++ tem a classe string e a classe string_view, e a aí você pode comparar diretamente strings porque nelas o operador '==' foi redefinido e para essa classe ele  incorpora a funcionalidade de strcmp() de varrer a string até o '\0' e ir comparando.

 

Para comparar assim em C++ teria que declarar nome_comodo como string e rever o resto do programa.

 

nome_comodo é um ponteiro para char e só pode ser comparado com outro ponteiro para char, em C ou C++.


Exemplo (em C++ ou C)

	char   nome_comodo[30] = { "teste" }; // [1]
	char*  pChar = nome_comodo;
	char*  outrop = NULL;
	if (pChar == nome_comodo)
		if (outrop == pChar)
			*(pChar + 1) = 'E';
			

Em C++ o igual em [1] é opcional e não recomendado. Está aqui exatamente pela razão que faz ele existir: portabilidade com código em C.

 

Veja aí que nome_comodo vale "teste". Mas você só pode fazer comparações como essas aí. Comparando com outros ponteiros para char. O código não faz sentido: é um exemplo que digitei no meio de meu programa

 

image.png.80d4fac0400ba427f894c091b4b65f18.png

 

Essa deveria ir para o forum de lógica.

Porque não funciona: duas coisas diferentes não podem ser iguais a uma terceira. A terceira coisa aqui seria o valor zero. Se a condição A for verdade a condição B será falsa e se a condição A for falsa a condição B poderá ser verdade, e assim ( A ou B ) será sempre verdade...

 

Acompanhe:

  • se nome_comodo for "fim" a primeira é falsa e a segunda é verdadeira e então a expressão A ou B é verdade
  • se nome_comodo for "FIM" a primeira é verdadeira e a segunda é falsa, então a expressão A ou B é verdade
  • se nome_comodo não for nem "fim" nem "FIM" as duas condições A e B são verdade e a expressão (A ou B ) é verdade
  • A outra condição, A e B verdadeiro é impossível, como eu disse no início

 Então a expressão escrita assim é sempre verdadeira e o while() nunca termina...

 

  • Curtir 1
  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

1 hora atrás, arfneto disse:

O determinante é a declaração:


	char nome_comodo[30];

Tanto em C quanto em C++. nome_comodo é um ponteiro para char, e assim *nome_comodo é um char. E é o que temos.

 

Tecnicamente isso não é verdade, podemos tentar compreende que sim é um ponteiro quando desreferenciado em certo momento a matriz "se rebaixa" a um ponteiro, e por último a variável do tipo. 

 

Entretanto a matriz, mais precisamente sua identificação, é uma referência (do tipo char (*) [30]). E um ponteiro é um ponteiro.

  • Curtir 1
  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

46 minutos atrás, Mauro Britivaldo disse:

Tecnicamente isso não é verdade, podemos tentar compreender que sim é um ponteiro quando desreferenciado

 

Você tem de fato formação na área de Teoria da Informação? Computação?
 

Isso que eu disse formalmente É a verdade, a definição da linguagem. Já leu um standard? Tem um livro em que acredite? Qual seria? Escreveu algum? Não é assim porque eu acho e você não.

 

Creio que a nomenclatura em português é dereferenciado numa herança do termo em inglês dereference. Um ponterio dereferenciado "tecnicamente" é do tipo da variável a que ele aponta. É a definição. Um ponteiro dereferenciado só será um ponteiro em casos como o clássico

char** argv

onde *argv é um pointer para char. Apenas quando o ponterio aponta para um ponteiro. E (**argv) é, pela mesma definição, um char. Pela mesma razão argv[1]  é do tipo char*, e argv[1][0] é um char, a primeira letra do nome completo de um programa em C ou C++. De modo bem similar em Pascal ou java ou Algol60.

 

46 minutos atrás, Mauro Britivaldo disse:

matriz "se rebaixa" ao um ponteiro e por último a variável do tipo

 

Sequer existe uma definição de matriz nessas linguagens. Isso é apenas aceito a  partir do uso acadêmico do termo matriz por matemáticos --- no caso a partir dos vetores multidimensionais em FORTRAN no início dos '60 --- e se entende que uma matriz seria um array com mais de uma dimensão. Isso sequer existe em C, onde o que seria uma matriz de duas dimensões é ou um vetor de vetores ou um bloco contínuo e uma fórmula de associação. Veja por exemplo a definição:
 

image.png.2117973b08d618d2864d4922f1c7a3ac.png

 

Do clássico "Estruturas de Dados Usando C" - de Aaron Ai Tenenbaum, Yedidyah Langsam, e Moshe J. Augenstein editado em português pela Makkron Books

 

46 minutos atrás, Mauro Britivaldo disse:

Entretanto a matriz, mais precisamente, seu identificação é uma referência (do tipo char (*) [30]) e um ponteiro é um ponteiro

 

Isso que escreveu está de fato além da minha compreensão ou não faz sentido mesmo.

 

Recomendo muito que estude antes de postar essas coisas. Linguagens são coisas absolutamente formais e descritas em padrões rígidos. Não basta achar que algo é assim ou ter uma forte opinião. Existe um padrão,. um standard como o draft do standard de C ISO 9899 o último padrão eu não tenho, custa $198. Mas esse é um draft e serve bem para o que quero dizer.

 

É legal ter opiniões controversas e tal, mas tem coisas que simplesmente são definidas a partir de rígidos padrões. Por favor não poste essas coisas sem referência ou embasamento apenas dizendo que são fatos ou que tecnicamente é isso e pronto. É apenas mais uma versão de fake news.

 

 

 

 

  • Curtir 1
  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

@devair1010 Valeu! Entendi a parte do C++ ter a variavel string

adicionado 2 minutos depois

@Lucca Rodrigues Usei esse critério por conta da questão da facul que pediu, acho q foi pra gerar dúvidas mesmo. Eu sou um cara que não se conforma em ver gabarito, posso ficar mais de 5 horas no mesmo problema, mas não me conformo em me rebaixar em certo ponto, acredito que, o problema está ali pra ser resolvido, e depois tentar me perguntar o porque não dava certo. Valeu pela força.

adicionado 4 minutos depois
2 horas atrás, Lucca Rodrigues disse:

some 32 ao mesmo para convertê-lo para minúsculo.

@Lucca Rodrigues bacana, seria tipo um Upcase() em pascal? tem como me mandar um exemplo n precisa nem ser um código inteiro

adicionado 10 minutos depois
1 hora atrás, arfneto disse:

duas coisas diferentes não podem ser iguais a uma terceira

ISso me ajudou muito cara, fez muito sentido pra mim, o computador se iniciou do verdadeiro ou falso, to certo? então se uma coisa é falsa e é = 0 a outra q é verdade não pode ser = 0 na mesma condição! to certo?

 

@arfneto  

adicionado 17 minutos depois

@arfneto Teria em C um comando igual ao Upcase em pascal? facilitaria em vez de

17 minutos atrás, AnonymousLPH disse:

some 32 ao mesmo para convertê-lo para minúsculo.

 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

16 minutos atrás, AnonymousLPH disse:

ISso me ajudou muito cara, fez muito sentido pra mim, o computador se iniciou do verdadeiro ou falso, to certo? então se uma coisa é falsa e é = 0 a outra q é verdade não pode ser = 0 na mesma condição! to certo?

 

Sim. Está certo. No geral isso se chama Algebra de Boole. No particular está é uma propriedade da igualdade: decorre de duas coisas iguais a uma terceira serem iguais entre si: a propriedade transitiva da igualdade. A igualdade também é simétrica e reflexiva. Essas 3 relações definem a igualdade: 

  • uma coisa é igual a ela mesma (reflexiva)
  • se A é igual a B B é igual a A para todo A (simétrica)
  • duas coisas iguais a uma terceira são iguais entre si (transitiva)

E dessa última decorre aprova daquele troço de && e || 

 

Sobre a parada de maiúsculas/minúsculas eis um pedaço da tabela ASCII onde tem os códigos das letras e você vê que a diferença é sempre 32. As minúsculas são menores porque no início não havia minúsculas. Durante muito tempo os computadores e impressoras só tinhas maiúsculas e por isso elas vieram antes e depois foram aumentando os códigos para 128 e depois 256 e hoje estão em 1.1 milhão de símbolos :D na tabela Unicode

318530368_letrasASCII.png.3aec739a4759228ef34cbb40678f8dc9.png


32 é o bit 5 então você pode converter uma letra para minúscula fazendo letra = letra | 32; ou fazendo a conta mesmo, somando 32.

 

O contrário claro também é verdade. Mas no seu caso teria que fazer isso com TODAS as letras, cero? um loop como faz strcmp()

 

 

 

adicionado 3 minutos depois
28 minutos atrás, AnonymousLPH disse:

Entendi a parte do C++ ter a variavel string

 

É uma classe, e você pode declarar variáveis dessa classe. São chamadas instâncias em C++

    string nome_comodo;

e até poderia acessar a string do jeito C usando nome_comodo.c_str(); o que é chamado método da classe string. Um deles. 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

9 minutos atrás, AnonymousLPH disse:

O jeito é  usar a função mesmo, não vale a pena refazer a roda, mas saber como a roda foi feita. Obrigado mesmo.

 

Sim. Pode reescrever strcmp() ou mesmo ver a tal roda feita como está em  https://code.woboq.org/userspace/glibc/string/strncmp.c.html

 

Mas é só um loop mesmo.

  • Curtir 1
  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

@arfneto Eu até que gosto de ler seus argumentos, entretanto ...

 

1 hora atrás, arfneto disse:

Creio que a nomenclatura em português é dereferenciado numa herança do termo em inglês dereference. Um ponterio dereferenciado "tecnicamente" é do tipo da variável a que ele aponta. É a definição. Um ponteiro dereferenciado só será um ponteiro em casos como o clássico


char** argv

onde *argv é um pointer para char. Apenas quando o ponterio aponta para um ponteiro. E (**argv) é, pela mesma definição, um char. Pela mesma razão argv[1]  é do tipo char*, e argv[1][0] é um char, a primeira letra do nome completo de um programa em C ou C++. De modo bem similar em Pascal ou java ou Algol60.

Creio que apenas a nomenclatura corresponde ao assunto porque de fato errei (no português). 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

@AnonymousLPH

58 minutos atrás, AnonymousLPH disse:

Teria em C um comando igual ao Upcase em pascal? facilitaria

Mas não é difícil...

for(int i = 0; i < len; i++){ //len, nesse caso, é o tamanho da string
	if(text[i]>='A' && text[i]<='Z'){ //detecta se é letra maiúscula
		text[i]=text[i]+32; //converte para minúscula
	}
}

Apenas use funções quando for algo extenso. Se for algo como elevar um número ao quadrado, compensa mais fazer n*n.

Se for simplesmente transformar uma letra maiúscula em minúscula, faça isso daí acima, acho que não compensaria fazer algo semelhante, só que usando a função tolower().

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

2 minutos atrás, Lucca Rodrigues disse:

@AnonymousLPH

Mas não é difícil...


for(int i = 0; i < len; i++){ //len, nesse caso, é o tamanho da string
	if(text[i]>='A' && text[i]<='Z'){ //detecta se é letra maiúscula
		text[i]=text[i]+32; //converte para minúscula
	}
}

Apenas use funções quando for algo extenso. Se for algo como elevar um número ao quadrado, compensa mais fazer n*n.

Se for simplesmente transformar uma letra maiúscula em minúscula, faça isso daí acima, acho que não compensaria fazer algo semelhante, só que usando a função tolower().

 

No geral as funções que manipulam caracteres estão em ctypes.h. Tem uma tabela em  https://www.tutorialspoint.com/c_standard_library/ctype_h.htm

  • Curtir 2
Link para o comentário
Compartilhar em outros sites

@arfneto Estava vendo umas aulas conceituais do meu professor engenheiro de software, ele cita que a cadeia de char é um ponteiro, tanto que no scanf tu não precisa referenciar ela com < , & >@Mauro Britivaldo "vetor em linguagem C é ponteiro" , foi isso q entendi.

  • Curtir 2
Link para o comentário
Compartilhar em outros sites

@AnonymousLPH Será mesmo! Porque até onde aprendemos um ponteiro é simplesmente uma variável que armazena um valor numérico que (quase sempre) é o endereço de outra variável.

 

Seu exemplo com a função scanf é um bom argumento também, porém será que só isso basta?  É de ponteiros que estamos falando ou de referência (endereço de locais reservados na memória). O que mais de ponteiros além do que citou existe de comum entre os dois. Ou só isso basta pra você?

  • Curtir 1
  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

Um último exemplo prático que questiona afirmação difundida na literatura acerca do identificador matriz.

 

#include <stdio.h>

int main (void){
	char matriz [30];
	char *ponteiro;
	char **ponteiro_de_ponteiro;

	ponteiro_de_ponteiro = &ponteiro;
	ponteiro_de_ponteiro = &matriz;

	printf ("M: %u == P: %u \n", sizeof matriz, sizeof ponteiro);
  	getchar ();
	return 0;
}

Se matriz é um ponteiro para char então esse programinha compila com 0 alertas,

E M == P senão matriz é não ponteiro.

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

7 horas atrás, AnonymousLPH disse:

a cadeia de char é um ponteiro, tanto que no scanf tu não precisa referenciar ela com < , & >

 

 

Sim. Em C ou C++ uma cadeia de char é uma sequência de bytes, terminada por um 0, o tal NULL, o '\0'. Isso de um ponto de vista lógico. Em termos de memória, de alocação, uma string ou vetor é determinada (o) por um nome, e um comprimento. O nome corresponde a um ponteiro para o início e é um ponteiro como outro qualquer.

O comprimento é outra parada.

Veja esses casos

	const char* valor = "teste";
	char* outro_c = "outro";
	char coisa[20];
	char* vetor = (char*)malloc(30);
	const char* pc;
	char* outroP;
	const char* const pConst = coisa;

Os ponteiros para char são ponteiros e tem o tamanho de todos os ponteiros, em geral 4 bytes. Mas a área alocada é um problema a determinar. No caso de vetor oficialmente não dá pra saber. Está claro que são 30 aí mas o que você pode fazer com essa área é liberar os 30 (sem saber quantos são), realocar para algum outro valor, mesmo que sejam 30 de novo (e talvez mudando o endereço). Não dá pra saber o tamanho. coisa é formalmente como p, um const char*. Mas p não aponta para nada e sequer foi inicializado. pConst veio para ficar: aponta fixamente para um endereço fixo ;)

 

A questão de scanf() não foi bem descrita. Formalmente o fato é que scanf() não aloca memória: é preciso passar o endereço de uma área de memória previamente alocada. Usar & para passar o endereço de algo para scanf() é apenas fornecer o que a função espera. Como um vetor é identificado pelo início, scanf() se contentaria com coisa ou com pc porque são apontadores para uma área. valor não serviria porque é const, mas outro_c serviria mas vai cancelar o programa...

 

Em resumo: é preciso dançar conforme a música.

 

@Mauro Britivaldo 

5 horas atrás, Mauro Britivaldo disse:

último exemplo prático que questiona afirmação difundida na literatura acerca do identificador matriz

 

Não dá pra entender que "afirmação difundida na literatura" você estaria questionando, e seu exemplo tem erros básicos. Não há nada demais em questionar a literatura. Autores erram e mesmo normas ISO são revistas por erros. Mas acho que deveria explicar o que está questionando e qual o seu argumento ao invés de difundir coisas assim

 

Seu "exemplo prático"

mch.png.382576583d7a8ddb4baf3377360a33ec.png

 

5 horas atrás, Mauro Britivaldo disse:

Se matriz é um ponteiro para char então esse programinha compila com 0 alertas

 

Note que matriz sequer é um ponteiro para char, apesar de apontar para um. Seu compilador deve ter te dito isso nas mensagens de erro. Leia abaixo.

 

Veja que na linha 10 seu programa já tem dois erros bobos e sequer compilaria, porque faltam os parenteses nos dois sizeof(). Não seria um alerta, apenas um erro. Dois erros.

 

E a linha 7 poderia gerar um alerta dependendo das opções de compilação: qual o propósito de atribuir um valor a ponteiro_de_ponteiro na linha 7 e outro na linha 8?

	ponteiro_de_ponteiro = &ponteiro; // ??? vai ser sobreposto na linha seguinte
	ponteiro_de_ponteiro = &matriz;   // ??? matriz é char(*)[30] e ponteiro é char**


Poderia ter escrito milhares de linhas assim e apenas a última atribuição iria sobreviver.

 

Não sei que compilador usa, e não sei as opções de compilação que usa para compilar isso --- /W0 talvez? --- mas a atribuição na linha 8 deve gerar erro, um warning, um alerta. 

 

image.thumb.png.74567be35dbf3a271c0e64dca85b4879.png

 

No gcc 8.2

 

Ou 
 

image.thumb.png.2109c7aa113608bb7a0712d5acc77e38.png

 

no CL 19.26

 

E pode aproveitar para ler que matriz não é um pointer para char simplesmente, ao menos segundo o gcc e o CL e o ANSI C e eu.

 

Corrigindo o seu programa

#include <stdio.h>
int main(void){
	char matriz[30];
	char* ponteiro;
	char** ponteiro_de_ponteiro;
	ponteiro_de_ponteiro = &matriz;
	printf("M: %u == P: %u \n", sizeof(matriz), sizeof(ponteiro));
	return 0;
}

Matriz é do tipo char[30]; Foi declarada estaticamente. Então quanto acha que sizeof(matriz) vai retornar? Sem surpresas, 30. E ponteiro_de_ponteiro foi declarado char**. Quanto acha que sizeof() vai retornar? Sem surpresas, vai retornar 4 ou 8 porque ponteiro_de_ponteiro é um ponteiro, assim como ponteiro e o tamanho dele é... sizeof(int*)  por exemplo, já que hoje em dia os ponteiros tem o mesmo tamanho para qualquer tipo. Tanto faz para onde aponte. sizeof() é só um operador. Um ponteiro é só um ponteiro.

 

Entendendo sizeof()

 

Acrescentando uma outra chamada a  printf() em seu programa e corrigindo os erros

#include <stdio.h>
int main(void){
	char matriz[30];
	char* ponteiro;
	char** ponteiro_de_ponteiro;
	ponteiro_de_ponteiro = (char**) matriz;
	printf("M: %u == P: %u \n",
		sizeof(matriz),		sizeof(ponteiro));

	printf("M: %u == P: %u\n",
		sizeof(char[30]),	sizeof(char**));
	return 0;
}

Você vai ver
 

 image.png.851c7b179ff1a50ecb101c1e9b518424.png

 

Sim, dá na mesma. Não faz diferença para sizeof()

 

Se escrever

	ponteiro_de_ponteiro = (char**)matriz;
	printf("M: %u == P: %u \n",
		sizeof(matriz), sizeof(ponteiro));

	ponteiro_de_ponteiro = 28;
	printf("M: %u == P: %u \n",
		sizeof(matriz), sizeof(ponteiro));

	ponteiro_de_ponteiro = NULL;
	printf("M: %u == P: %u \n",
		sizeof(matriz), sizeof(ponteiro));

	printf("M: %u == P: %u\n",
		sizeof(char[30]),	sizeof(char**));

Vai ver 
 

image.png.cca8ceeacc5c50d5a704d143e88724c8.png

 

Porque dá na mesma. A menos que compile para 64 bits quando vai ter
 

image.png.e4ffdc8720654c927dc4b1f06d169a20.png

 

Sem surpresas.

 

Onde quer chegar? Seu "exemplo prático" uma vez corrigido diz o que em relação à literatura?

 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

1 hora atrás, arfneto disse:

Note que matriz sequer é um ponteiro para char

 

14 horas atrás, arfneto disse:

O determinante é a declaração:


	char nome_comodo[30];

Tanto em C quanto em C++. nome_comodo é um ponteiro para char, e assim *nome_comodo é um char. E é o que temos.

nome_comodo  também não é um ponteiro para char ?

 

 
1 hora atrás, arfneto disse:

Onde quer chegar? Seu "exemplo prático" uma vez corrigido diz o que em relação à literatura?

Discutir e mais nada.

 

 
1 hora atrás, arfneto disse:

E pode aproveitar para ler que matriz não é um pointer para char simplesmente, ao menos segundo o gcc e o CL e o ANSI C ...

Exatamente.

Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

 

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!