C语言——指针
指针类型的长度:
printf("%d %d\n", sizeof(double), sizeof(double *)); //所有类型的指针都是4,而sizeof(char)是1,sizeof(int、float)都是4
动态分配数组内存大小:
#include <stdio.h> #include <stdlib.h> int main() { int n = 1; scanf("%d", &n); int *p = (int *) malloc(n * sizeof(int)); //动态创建一维数组 p[n - 1] = 100; printf("%d\n", p[n - 1]); free(p); //free是malloc函数的逆过程,用于释放掉给指针分配的空间 return 0; } int m, n; scanf("%d %d", &m, &n); int *p = (int *) malloc(m * n * sizeof(int)); //创建二维数组 p[m * n + n] = 100; printf("%d\n", p[m * n + n]); free(p);
操纵指针:
*p++;//由于没有打括号,所以运算符*、++都是操纵变量p 若p为一个指针,那么p[i]:实质上,C的编译器会将p[i]解析成*(p+i),使得表达式更为简单
指向函数的指针(函数式编程):
#include <stdio.h> int func(int a) { return -1; } int function(int a) { return a; } int main() { int (*p1)(int) = func; printf("%d\n", p1(1)); p1 = function; printf("%d\n", p1(100)); }
用指针删除字符串中指定字符(除了指针版,还有数组版、下标指针版:*pi,*pj):
char *delChar(char *s, char c) { int i, j;//在遇到c之前,j = i;遇到c之后,j = i - 1; for(i = 0, j = 0; *(s + i) != 0; i++) { if(*(s + i) != c) { *(s + j) = *(s + i); j++; } } *(s + j) = '\0'; return s; }
求一个短语中,单词的个数:
int WordCount(char *p) { int n = 0; for(; *p != '\0'; p++) { if(*p == ' ') continue;//È¥µôÿ¸öµ¥´ÊÇ°ÃæµÄ¿Õ¸ñ if(isalpha(*p)) { n++; for(; *p != '\0' && isalpha(*p); p++); } } return n; }
内存管理:
函数<stdlib.h>:
- void *calloc(int num, int size);
- void free(void *address);
- void *malloc(int num);
- void *realloc(void *address, int newsize);