C语言面试题
2015-08-02 14:38
459 查看
#include <stdio.h> int main() { int a[5] = {1, 2, 3, 4, 5}; int* p1 = (int*)(&a + 1); // <==> (unsigned int)&a+sizeof(*&a) => 整个数组后面的那个地址 int* p2 = (int*)((int)a + 1); <=> 取a[0]后三个字节拼接a[1]第一个字节 => 0x02000000 int* p3 = (int*)(a + 1); <=> a[2] printf("%d\n", p1[-1]); // (unsigned int)p1-1*sizeof(*p1) => a[4] printf("%d\n", p2[0]); // 0x02000000 printf("%d\n", p3[1]); // a[3] return 0; }
一条语句实现strlen
return (assert(s), (*s ? strlen(s+1)+1 : 0));
#size_t为无符号整数 strlen的返回值为 size_t 类型 size_t strlen(const char* s) { size_t length = 0; aasert(s);//当指针为空时运行出错 assert.h while(*s++) { length++; } return }
strcpy实现
#include <stdio.h> #include <assert.h> char* strcpy(char* dst, const char* src) { char* ret = dst; assert(dst && src); while( (*dst++ = *src++) != '\0' ); return ret; } int main() { char dst[20]; printf("%s\n", strcpy(dst, "Delphi Tang!")); return 0; }
重置动态空间的大小:
#include <stdio.h> #include <malloc.h> int reset(char**p, int size, int new_size) { int ret = 1; int i = 0; int len = 0; char* pt = NULL; char* tmp = NULL; char* pp = *p; if( (p != NULL) && (new_size > 0) ) { pt = (char*)malloc(new_size); tmp = pt; len = (size < new_size) ? size : new_size; for(i=0; i<len; i++) { *tmp++ = *pp++; } free(*p); *p = pt; } else { ret = 0; } return ret; } int main() { char* p = (char*)malloc(5); printf("%0X\n", p); if( reset(&p, 5, 3) ) { printf("%0X\n", p); } return 0; }
一维方式打印二维数组:
#include <stdio.h> #include <malloc.h> void printArray(int a[], int size) { int i = 0; printf("printArray: %d\n", sizeof(a)); for(i=0; i<size; i++) { printf("%d\n", a[i]); } } int main() { int a[3][3] = {{0, 1, 2}, {3, 4, 5}, {6, 7, 8}}; int* p = &a[0][0]; printArray(p, 9); return 0; }
指针方式打印二维数组:
#include <stdio.h> int main(int argc, char* argv[], char* env[]) { int a[3][3] = {{0, 1, 2}, {3, 4, 5}, {6, 7, 8}}; int i = 0; int j = 0; for(i=0; i<3; i++) { for(j=0; j<3; j++) { printf("%d\n", *(*(a+i) + j)); } } }
#include <stdio.h> int main() { int a[5][5]; int(*p)[4]; p = a; printf("%d\n", &p[4][2] - &a[4][2]); // -4 }
指针阅读技巧:
右左法则
1、从最里层的(最左)圆括号中未定义的标识符看起
2、先往右看,再往左看
3、当遇到圆括号或者(方括号时可以确定部分类型),并调转方向
4、重复 2,3 知道结束
#include <stdio.h> int main() { int (*p2)(int*, int (*f)(int*)); int (*p3[5])(int*); int (*(*p4)[5])(int*); int (*(*p5)(int*))[5]; }
返回 int(*)[5] 数组指针类型
#include "stdio.h" int test(int i) { return i; } int (*test(int *p))[5] //返回类型为 int(*)[5] { static int a[5]={1,2,3,4,5}; return &a; } int main(int argc, char** argv, char* env[]) { int (*(*p5)(int*))[5]; int a = 1; //p5 = &a; p5 = test; int(*p)[5] = p5(&a); printf("%d \n", *(*p+1)); printf("%d \n", *(*p+2)); return 0; }
动态申请二维数组(没用一维数组指针实现,而是用的普通的int *指针)
int **malloc2d(int row, int col) { int** ret = (int**)malloc(sizeof(int*)*row); int* p = (int*)malloc(sizeof(int)*row*col); int i = 0; if (ret && p) { for (i = 0; i < row;i++) { ret[i] = (p + i*col); } } else{ free(p); free(ret); } return ret; } void free2d(int **a) { free(a[0]); free(a); }
二维数组做参数
#include <stdio.h> void access(int a[][3], int row) { //没必要传递列,可以计算出来,c语言中只有一维数组 int col = sizeof(*a) / sizeof(int); int i = 0; int j = 0; printf("sizeof(a) = %d\n", sizeof(a)); for(i=0; i<row; i++) { for(j=0; j<col; j++) { printf("%d\n", a[i][j]); } } } int main() { int a[3][3] = {{0, 1, 2}, {3, 4, 5}, {6, 7, 8}}; access(a, 3); }
求n个数的平均值
#include <stdio.h> #include <stdarg.h> float average(int n, ...) { va_list args; int i = 0; float sum = 0; va_start(args, n); for(i=0; i<n; i++) { sum += va_arg(args, int); } va_end(args); return sum / n; } int main() { printf("%f\n", average(5, 1, 2, 3, 4, 5)); printf("%f\n", average(4, 1, 2, 3, 4)); return 0; }
按字节进行清零
#include <stdio.h> #define RESET(p, len) while( len > 0) ((char*)p)[--len] = 0 void reset(void* p, int len) { while( len > 0 ) { ((char*)p)[--len] = 0; } } int main() { int array[] = {1, 2, 3, 4, 5}; int len = sizeof(array); reset(array, len); RESET(array, len); return 0; }