"Aprenda a linguagem C em um minuto todos os dias·8" Strings, ponteiros e matrizes bidimensionais, códigos complementares, negação bit a bit

1.
Enumeração

enum WeekDay  //这是一个数据类型
{
    
    
	//MonDay, TusDay,....
};
enum WeekDay day = MonDay;
printf(%d\n”, day); //输出0,枚举里面元素都是从0开始排列

2.
String
(1) É necessário haver uma barra invertida antes de adicionar aspas duplas na string
(2)% p é o endereço de impressão,% u gera decimal sem sinal, -123 gera complemento 4294967173
% 8.3f // justificado à direita, a largura for 8, mantenha três casas decimais, se a largura for menor que 8, preencha com 0 ou espaços, e um sinal negativo indica alinhamento à esquerda
(3) const char m[10] = "helloworld"; //const na frente significa que o valor não pode ser alterado
const char * pst = "helloworld"; //O valor não pode ser alterado, mas o endereço pst pode ser alterado
char * const pst = "helloworld"; //O endereço não pode ser alterado, mas o o valor pode ser alterado
char const * pst = "helloworld"; //O valor não pode ser alterado e o endereço é variável.
Resumindo: o valor de const no lado esquerdo de * não pode ser alterado e o endereço de const no lado direito de * não pode ser alterado
. (4) Por padrão, há um caractere nulo '\0' no final da string, como char * name = "huang"; //O número total de bytes é 6
(5) char [10] = {'a', 'b', 'c', '\0'}; //Com string de tabela de caracteres vazia, sem tabela de caracteres vazia array de caracteres (
6) char * name = " helloworld"; //Equivalente a char name[] = "helloworld"; Deve-se notar que a string definida pelo array pode ser modificada, mas a string definida pelo ponteiro não pode ser modificada (
7) arr é um array O nome também é o endereço do primeiro elemento, arr+1 representa o endereço do segundo elemento, mas arr é uma constante de ponteiro, um lvalue não modificável, caso contrário, o local de armazenamento da matriz, ou seja, o endereço, será alterado, e a operação de incremento automático de ++arr não é permitida.Isto só pode ser usado para lvalues ​​modificáveis. Se for uma string definida por um ponteiro, o endereço pode ser modificado e incrementado, como char * name = "huang"; //name++ significa apontar para o próximo endereço do elemento
(8) Definir a matriz de caracteres para abrir um endereço espaço na memória e coloque os caracteres A string é armazenada, e o ponteiro define a string atribuindo o endereço da string ao ponteiro, de modo que o endereço da matriz do primeiro é diferente do endereço da string, e o endereço do último é o mesmo.
(9) Adicionando endereço e inteiro = inteiro X endereço aponta para o tipo tamanho de byte + endereço
Subtraindo endereço e inteiro = endereço -
inteiro O ponteiro aponta para a mesma matriz, como 0Xff8d8-0Xff8d0=2 representa a distância entre dois tipos Int
(10 ) puts(nome) //A string de saída termina quando encontra '\0' e quebra automaticamente a
linha get(nome) //Entra a string, absorve \n e converte-a no caractere \0
fgets(nome, 5, stdin); //Retorna ao endereço do primeiro caractere, digite hu, e o que está salvo em Nome é hu\n\0\0 Digite huan, salve huan\0 Digite huanghua, salve huan\0
fputs(name, stdout); //A string de saída termina com \0 e não quebra automaticamente
(11) strlen(name); //Calcula o comprimento da string, excluindo \0
strcat(str1 , str2); //Divide a string str2 até o final de str1 para formar uma nova string str1 e adicionar automaticamente \0 no final (nota: a string str2 começa a ser emendada quando vê o caractere nulo da string str1 e é emendada em uma nova string. o conteúdo é copiado para o espaço de memória apontado por str1, e o conteúdo é copiado, não o endereço)
strncat(str1, str2,5); //Os primeiros cinco caracteres em str2 são unidos na parte de trás de str1 para formar um novo str1, e \0 é adicionado automaticamente no final
strcmp(str1 , str2); //Compara os valores do código ASCII de duas strings da esquerda para a direita, se for igual, retorna 0, str1>str2 retorna um número inteiro positivo , str2>str1 retorna um número inteiro negativo
strncmp(str1, str2, 5); //Compara duas strings Os primeiros cinco caracteres
strcpy(str1, str2); //Copia a string str2 para str1 para formar um novo str1. O que é copiado é o conteúdo da string, não o endereço.
strncpy(str1, str2, 5); //Copia str2 para a frente 5 caracteres são copiados para str1
(12) getchar() recebe um caractere e retorna, nenhum caractere retorna -1 ou EOF
putchar('S'); gera um caractere
(13) atoi(str) //transforma a string em saída inteira, como int i = atoi("22"); //i é o inteiro 22
itoa(i) / /Converter o inteiro em uma saída de string, como char * p = itoa(22); //Saída String 22
atof() //Converter string numérica em tipo duplo, como double b = atof("23.4"); / /Saída 23.4
ftoa() //Tipo de ponto flutuante para string, char * p = ftoa(23.4) ; //Saída string 23.4
atol() //Converte string para tipo longo, long a = atol("23"); / /Saída tipo longo 23
Nota: O número máximo que só pode ser convertido é 2147483648. Se você deseja converter valores maiores, é necessário atol
ltoa()//Converter tipo longo em string, char *p = ltoa(23); // String de saída 23
(14) sprintf(str, “%d, %s”, 2, “huanghua”); // A string str armazena 2,huanghua
(15)%.5s //Sai até cinco caracteres, %5s //Exibe pelo menos cinco caracteres, sem espaços suficientes para preencher
(16) fscanf(fp, “%d %d %s ", &i, &j, str); //Lê os dados do ponteiro do arquivo fp para i, j, str. O terceiro bloco é a lista de entrada
fprintf(fp, "%d %d %s", i, j, str); //Escreve o conteúdo de i, j, str no arquivo de ponteiro fp e o terceiro bloco é a lista de saída
(17) char * strchr(const char *s, int c) //Se a string s contém o caractere c, a função retorna um ponteiro para a primeira ocorrência do caractere c na string s (o caractere nulo no end também faz parte da string, portanto está dentro do intervalo de pesquisa. Se o caractere c não for encontrado, NULL será retornado.
(18) char *strpbrk(const char *s1, const char *s2) //Se a string s1 contém algum caractere da string s2, a função retorna um ponteiro para a primeira posição da string s1, caso contrário retorna NULL
( 19) char * strrchr(const char *s, int c) //A função retorna o ponteiro de posição da última ocorrência do caractere c na string s (o último caractere nulo também está no intervalo de pesquisa), se o c caractere não for encontrado, ele retorna NULL
(20) char * strstr (const char *s1, const char *s2) //A função retorna a primeira posição apontando para a string s2 na string s1. Se s2 não puder ser encontrado, NULL é retornado.

3.
Ponteiros e arrays bidimensionais
int a[4][2]; //O array a possui 4 elementos grandes e cada elemento grande possui 2 elementos pequenos.
(1) a é o endereço do primeiro elemento grande, ou seja, a == &a[0]
(2) a[0] é o primeiro elemento grande, que pode ser considerado como b, então b[0], b [1] são o primeiro e o segundo elementos nesta matriz de elementos grandes, respectivamente, então a[0] é o endereço do primeiro elemento no elemento grande, ou seja, a[0] == &a[0][0]
( 3) *a == a[0], ** a == a[0][0]
(4) int (* p)[2] == int [][2] //Esta é uma string semelhante a uma definição de ponteiro, char * p = "huang"; Equivalente a char p[] = "huang"
(5) Int * p[2]; //Define um array do tipo int * com dois elementos, cada elemento é int * Type
(6) a[m][n] == * ( *(a+m)+n)
(7) typedef int arr[4]; //Torne arr um novo tipo de dados, que contém quatro dados do tipo Int. Em seguida, defina a variável arr a; equivalente a int a[4]; typedef arr pst[3]; //Torne pst um novo tipo de dados, que contém três dados do tipo arr. Em seguida, defina a variável pst p; equivalente a int pst[3][4];
lembre-se de algumas palavras sobre ponteiros:
char *p; char *q;
(1) Atribua o endereço p = q;
1. Altere o endereço armazenado no valor , o valor armazenado em outro endereço também mudará, porque todos apontam para o mesmo endereço.
2, p e q são dois indivíduos independentes. Eles não interferem um no outro depois que os endereços são atribuídos. Alterar o valor de p irá não afeta q. Alterar q O valor não afeta p. Por exemplo, p = q = 1001H, se q = 1002H, então p ainda é 1001H.
(2) O endereço do endereço atribuído &p = &q;
1. Se o endereço armazenado no endereço do endereço for alterado, o outro endereço também mudará, pois são todos endereços que apontam para o mesmo endereço.
2. &p e &q são dois indivíduos independentes. Eles não interferem um no outro após a atribuição dos endereços. Alterar o valor de &q não afetará &p, e alterar o valor de &p não afetará &q. Por exemplo, &p = &q = 1001H, se &q = 1002H, então &p ainda é 1001H.

4.

int a[10];
int * p = a;
* ++p == p[1]
++ *p == p[0]+1
*p++ //先取*p值,然后p指向下一个元素地址
*p+=2 //*p = *p+2

5.
Código complementar
. O código complementar de um número positivo é ele mesmo.
O código complementar de um número negativo, como o complemento de -3:
3 para binário 0011
negado +1. 1101
é um tipo Int porque há 28 1's na frente
. - O complemento de 3 hexadecimal é: fffffffd

Encontre o código original usando o código complementar: fffffffd
nega +1 0011 e
adiciona um sinal negativo a 3 para obter -3

Se for negativo, depende se o bit mais alto é 0 ou 1
char (8 bits em 1 byte, se o oitavo bit é 0 ou 1) -128 (80) - +127 (7F)
curto (2 bytes) - 32768 (8000) ——+32767 (7FFF)
int (4 bytes) -2147483648 (80000000) ——+2147483647 (7FFFFFFF)

Negação bit a bit ~
~ O valor de
9 é 1001, omitindo os 28 0s anteriores
~ 9 é 0110 e omitindo os 28 1s anteriores. Neste momento, o bit mais alto é 1, o que mostra que o código original é um
número negativo. Negativo. +1 é 1010, que é 10
mais 1. O sinal negativo é -10

Deslocamento bit a bit para a esquerda <<
8 << 3. O valor
8 é 1000. Desloque três bits para a esquerda e adicione 0 no lado direito a 0100 0000, que é 64.

6.
Um símbolo é avaliado e dois símbolos são usados ​​para determinar verdadeiro ou falso.
4&6 == 4
4&&6 ==1 é verdadeiro
! 4 == 0 é falso.

Insira a descrição da imagem aqui

おすすめ

転載: blog.csdn.net/cs1395293598/article/details/135172843