int * i; ou int * i; ou int * i; [fechadas]

30

Qual é o seu método favorito para declarar um ponteiro?

int* i;

ou

int *i;

ou

int * i;

ou

int*i;

Por favor, explique o porquê.

consulte também: http://www.stroustrup.com/bs_faq2.html#whitespace

lesmana
fonte
19
Eu preferiria se concentrar nos outros 3000 linhas ...
29
int*i;- o espaço em branco não cresce nas árvores, você sabe ...
Shog9
Esta é essencialmente a mesma pergunta; aqui está a minha resposta .
26412 Keith Thompson

Respostas:

75

Se você escrever:

int* i, j, k;

você sugere enganosamente que todos os itens i, j e k são indicadores de int.

Então, eu afirmo que é superior anexar * ao nome da variável.

Randall Schulz
fonte
35
E eu sugiro que int * i;não seja candidato apenas porque parece multiplicação rapidamente.
John K
11
+1 porque não considerei esse cenário antes.
Pops,
4
"você sugere enganosamente que todos i, j e k são indicadores de int." A menos que você esteja escrevendo C #, onde int*é visto como um tipo e int* i, jdeclara dois ponteiros. A questão pode ser considerada incompleta - depende do idioma que você está usando e quais estilos são razoáveis. Em CI int *x, em C #, faço o contrário.
Joren
11
@Joren: Desculpe, não sendo um programador de C #, simplesmente assumi olhando para o fragmento de código na pergunta que era C ou C ++.
Randall Schulz
Eu acho que é perfeitamente razoável supor que é C ou C ++, a menos que C # seja mencionado especificamente. Não se vê ponteiros em C # com muita frequência.
alternativa
62

Eu prefiro int* iporque item o tipo "ponteiro para um int" e sinto que isso o torna uniforme com o sistema de tipos. Obviamente, o comportamento bem conhecido aparece ao tentar definir vários ponteiros em uma linha (ou seja, o asterisco precisa ser colocado antes de cada nome de variável para declarar um ponteiro), mas eu simplesmente não declaro ponteiros dessa maneira. Além disso, acho que é um defeito grave nas linguagens do estilo C.

Tamás Szelei
fonte
8
Eu também sigo esta convenção. Pela mesma razão.
gablin
5
Pessoalmente, se estou declarando vários ponteiros no meu código, trato-o como um cheiro de código. Eu não deveria precisar de tantas dicas; e geralmente eu não. Portanto, a questão de várias declarações em uma única linha nunca aparece em nenhum código que eu escrevo: Uma declaração por linha.
greyfade 25/09/10
5
O problema com isso é que o tipo não é um "ponteiro para um int". C (e C ++) não tem um tipo de ponteiro. É um ponteiro para um bloco de memória, do qual é do tipo int.
Billy ONeal
10
Eu diria que *item um tipo de int.
Tim Goodman
5
@ Billy: Se sim, nunca vi essa confusão em 12 anos tentando entender, analisar e explicar as normas. "Ponteiro para um int" é um tipo perfeitamente válido em C e C ++.
23

Para C, onde não temos um forte foco nos tipos, prefiro:

int *i;

Porque tem uma ênfase no int, não no ponteiro. Qual é o int? *ié o int.

alternativo
fonte
2
Bom ponto. Com ponteiros, você pode pensar no início como parte do nome. Por exemplo, se você tem int i = 5, para obter o valor de i, você usar o nome i. Da mesma forma, se você tiver int *i; *i = 5, para obter o valor, use *i.
Mipadi
Eu li int * i como: * i é um int. Portanto, eu sou um ponteiro para int. Declarações variáveis ​​em C usam expressões de tipo, int e * são apenas operadores. int * i analisa como int (* (i)) e é interpretado como se eu tivesse o tipo ponteiro para inteiro. char * p [] analisa como char (* ([] (p)))) (porque [] tem precedência mais alta que *) e significa: p tem o tipo matriz de ponteiro para char.
Giorgio
Por esse motivo, acho que eles escolheram escrever * ao lado da variável, porque * é um operador aplicado a ela.
Giorgio
7

Eu tenho preferido int* ipor anos. No entanto, há um forte argumento int *iporque, ao usar o estilo anterior, você ainda deve se lembrar da regra de declaração múltipla:

int* a, *b; // not int* a, b;

Como você deve se lembrar dessa regra, não ganha nada de maneira simples - mas eu também não diria que é mais complexo. Evitar várias declarações em uma linha é apenas outra maneira de dizer que você se lembra dessa regra. A diferença entre os dois estilos é discutível.

Mesmo quando eu o uso, no entanto, é um pouco tolo fingir que a sintaxe da declaração C funciona de outra maneira, colocando o asterisco ao lado do tipo e não da variável à qual está sintaticamente ligado.

Eu não compro em que se enfatiza o tipo de ponteiro (para i) enquanto o outro enfatiza o tipo int (para *i), mas que pode ser que depois de 15 anos de C e C ++ uso, ele só é quando eu olhar para ele, sem ter que pensar nisso - algo que a maioria dos iniciantes que faz essa pergunta ainda não pode fazer.

Além disso, mesmo com a minha preferência, não acho estranho ler / escrever código no outro estilo. Consistência, blá blá blá.

Não precisa nem mencionar int * i.


fonte
6

Eu prefiro o primeiro. É natural que ser um ponteiro faça parte do tipo.

Como eu uso o C #, ele lida com tipos de maneira mais intuitiva que o C, portanto não há problema em declarar vários ponteiros na mesma instrução:

int* a, b, c; // three pointers
Guffa
fonte
4

Se você deseja declarar várias variáveis, mas não deseja repetir o asterisco:

template <typename T>
struct pointer_to
{
    typedef T* type;
};

pointer_to<int>::type p1, p2, p3;

(Como você pode ver dentro do modelo struct, eu prefiro o int* iestilo.)

E aqui está uma solução mais geral:

template <typename T>
struct identity
{
    typedef T type;
};

identity<int*>::type p1, p2, p3;

Este funciona com qualquer "tipo problemático", por exemplo, matrizes e referências:

identity<int[10]>::type a1, a2, a3;

identity<int&>::type r1(*p1), r2(*p2), r3(*p3);
fredoverflow
fonte
omg, c ++ sempre mostra algo novo para mim :). Obrigado!
Tamás Szelei 27/09/10
11
OMG, C ++ é horrível! typedef int* int_ptrteria feito o truque. Claro, tenho que declarar um novo typedef para diferentes tipos de ponteiros, mas, na prática, quantos serão? Oito no máximo?
benzado 14/10
11
@benzado Na prática, você não precisa do typedef ou de nenhum dos truques sofisticados que demonstrei, porque nenhuma pessoa sã declara várias variáveis ​​em uma linha. Ainda interessante, no entanto.
Fredoverflow 16/10/10
2
Eu sei, eu estava falando mais sobre a tendência dos programas C ++ de usar recursos de linguagem apenas porque eles podem.
benzado
@benzado: !!! Eu já vi isso com tanta frequência!
Giorgio
2

Eu iria int* i;desde que a primeira parte denota o tipo de variável (ponteiro para int), enquanto a segunda parte denota o nome ( i). Não faria sentido para mim que o tipo é inte o nome é *i. Além disso, int * i;parece um pouco com multiplicação para mim.

Allon Guralnek
fonte
A sintaxe da declaração C não é consistente nesse aspecto, pois as informações de tipo podem vir facilmente após o identificador: matrizes sendo o exemplo mais claro.
@ Roger: Eu sei, mas esta questão era especificamente sobre uma única declaração de variável e nada mais.
Allon Guralnek 26/09/10
Eu acho que está lendo um pouco demais. :) Pelo que entendi a pergunta, é perguntando sobre qual estilo você usa em qualquer lugar.
@ Roger: Você provavelmente está certo, mas meu objetivo era responder à pergunta do OP: "Qual é o seu método favorito para declarar um ponteiro?". Obviamente, todos são livres para dar uma olhada no assunto apresentado na pergunta, e isso é encorajado aqui. Como alguém que não se desenvolve em C / C ++, senti que isso se afastaria muito da minha área de especialização.
Allon Guralnek
2

Nas declarações que eu uso int * i;, você lê como i is a pointer to an integer.

O ponteiro contribui para o tipo e a variável, portanto deve estar no meio.

É bom evitar declarar várias coisas na mesma linha: int * i, j;

Tamara Wijsman
fonte
1

Na verdade, eu uso as três convenções em circunstâncias específicas. À primeira vista, pareço inconsistente, mas ...

  • int * quando o identificador não estiver presente, reforçar visualmente que o nome não está presente.
  • int* intptrem se typedefdeclarações semelhantes para reforçar visualmente que faz parte do tipo. Da mesma forma com declarações de ponteiro de função:(int* (*foo)(int))
  • int *identifiere class &identifiernos parâmetros de função para reforçar visualmente que o parâmetro é potencialmente o chamado parâmetro "fora".
  • const int * const * constsempre que eu uso qualificadores cv .
  • int * foo; nas declarações locais.

Acho que tenho alguma orientação visual.

greyfade
fonte
1

Não há tipos de ponteiros em C! Então, "int *" não significa nada. O asterisco está sempre vinculado ao elemento escrito à sua direita, pertence ao elemento à sua direita. "* i" é um int. E por causa de * i é um int, segue-se que i é um ponteiro para int. Essa é a lógica por trás disso e é por isso que "int * i" é a única solução possível. Tudo o resto é uma ilusão (que é automaticamente corrigida pelo compilador na maioria dos casos). Em C ++ e C # isso é algo diferente. Mas para C há apenas uma Bíblia: "Dennis M. Ritchie: A linguagem de programação C". Dennis (RIP!) Escreveu: "int * i". Não há necessidade de questionar isso.

Lexi Pim
fonte
6
"Não há tipos de ponteiros em C" - De onde você tirou essa ideia? int*é um tipo de ponteiro.
26412 Keith Thompson
-2

Eu uso int *iporque é mais fácil ver que é um ponteiro, embora eu não ache que seja realmente uma questão.

tia
fonte