关于数组与指针的理解
2015-08-30 00:35
411 查看
2.4返回堆上一维空间
2.4.1一级指针作为返回值输出
2.4.2二级指针作为函数参数输出
2.5返回堆上二维空间
二维空间,并不一定就是二维数组,具有数组的访问形式。但己经远远不是数组 的定义了。
2.5.1一级指针作返回值输出
2.5.2二级指针作返回值输出
★内存不连续
★内存连续的
★如何释放
通过函数参数,二级指针传地址释放
2.5.3三级指针作为函数参数输出
返回二维空间总结:二级指针和二维数组名,没有关系。不代表二级指针,同二维空间没有关系。
练习:1、判断一个机子的大小段对齐(两种方法)
2.文件读写
3.求大小
2.4.1一级指针作为返回值输出
void * allocMem(int base,int count) { void *p = malloc(base *count); return p; return p; } int main() { char *p = allocMem(sizeof(char),100); strcpy(p,"china"); printf("%s",p); free(p); return 0; } |
int allocMem(void **p,int base,int n) { *p = malloc(base*n); if(*p == NULL) return -1; } int main() { char *p = NULL; allocMem(&p,sizeof(char),100); strcpy(p,"china"); printf("%s",p); free(p); return 0; } |
二维空间,并不一定就是二维数组,具有数组的访问形式。但己经远远不是数组 的定义了。
2.5.1一级指针作返回值输出
void * alloc2DMem(int base,int row,int line) { void *p = malloc(base*row*line); return p; } int main() { int (*p)[5] = alloc2DMem(sizeof(int),3,5); for(int i=0; i<3; i++) { for(int j=0; j<5; j++) { p[i][j] = i+j; } } for(int i=0; i<3; i++) { for(int j=0; j<5; j++) { printf("%d ",*(*(p+i)+j)); } putchar(10); } free(p); return 0; } |
★内存不连续
void **calloc(int base,int row,int line) { void **p=malloc(row*sizeof(char *)); int i=0; for(i=0;i<row;i++) { p[i]=malloc(base*line); } return p; } |
void **calloc(int base,int row,int line) { void **p=malloc(row*sizeof(char *)); char (*a)[row*line]=(char\ //这里定义void *也可以 (*)[row*line])malloc(base*row*line);//这里分配空间用数组指针,需要多加注意,因为这里都是值了,用指针数组的话又是一个二级指针了 int i=0; for(i=0;i<row;i++) { p[i]=a++;//这里单纯的是赋给空间 } return p;} |
通过函数参数,二级指针传地址释放
void freecalloc(int **p,int n)//这里的n为行数 { int i=0; for(i=0;i<n;i++) { free(p[i]); } free(p); } |
void allocMem(void ***p,int row,int line) { *p=malloc(row*sizeof(void *));//*p就为二级指针了 for(int i=0;i<row;i++) { (*p)[i]=malloc(base*line);//*p要打括号,作为一个整体,相当于void **p中的p } } |
练习:1、判断一个机子的大小段对齐(两种方法)
void bigOrsmall() { int data = 0x12345678; char *p = (char*)&data; if(*p == 0x78) printf("small endian\n"); else printf("big endian\n"); } void bigOrsmall2() { union un { int a; char b; }; union un u; u.a = 0x12345678; if(u.b == 0x78) printf("small endian\n"); else printf("big endian\n"); } int main(void) { char a; short b; int c; double d; float e; //&取变量空间中低位字节的地址,指针的大小4个字节 char * p = &a; bigOrsmall2(); *(int*)0x12345678 = 1234; char *p = NULL; char *p; p = NULL; *p = NULL; return 0; } 注意:int a=0x12345678 小端对齐 大端对齐 12 78 34 56 56 34 78 12 高位在高地址 高位在低地址 |
char* code(char * buf,int line) { int len = strlen(buf); int nlen = len; if(len%line !=0) nlen = len + (line - len%line); char *pt = calloc(nlen+1,1); strcpy(pt,buf); for(int i=len ; i<nlen; i++) { pt[i] = '*'; } char * secret = calloc(nlen+1,1); char *ps = secret; char(*pa)[line] = (char(*)[line])pt; for(int i=0; i<line; i++) { for(int j=0;j<nlen/line; j++) { *ps++ = pa[j][i]; } } *ps = '\0'; free(pt); return secret; } char* decode(char * buf, int line) { int len = strlen(buf); line = len /line; char * desecret = calloc(len+1,1); char *pd = desecret; char(*pt)[line] = (char(*)[line])buf; for(int i=0; i<line; i++) { for(int j=0; j<len/line; j++) { *pd++ = pt[j][i]; } } *pd = '\0'; while(*--pd=='*') *pd = '\0'; return desecret; } int main(void) { char * buf = "my name is techwang"; char *secret = code(buf,7); printf("secret = %s\n",secret); char * dese = decode(secret,7); printf("dese = %s\n",dese); free(secret); free(dese); return 0; } 注意:fgets会得到\0 strcpy也会同时拷贝\0,FILE *p p指向的是FILE这个结构体中的内容 |
#include <stdio.h> void func(int b[100]) { printf("%d\n",sizeof(b));//4 } int main(void) { int *p = NULL; printf("%d\n",sizeof(p)); //4 printf("%d\n",sizeof(*p));//4 int a[100]; printf("%d\n",sizeof(a)); //400 printf("%d\n",sizeof(a[100])); //4 printf("%d\n",sizeof(&a[0]));//4 int b[100]; func(b); int c[2][3]; printf("%d\n",sizeof(c)); //24 printf("%d\n",sizeof(c[0])); //12 int (*d)[3]; printf("%d\n",sizeof(d));//4 char *q = malloc(100); printf("%d\n",sizeof(q));//4 printf("%d\n",sizeof(&a));//4 //window vs linux return 0; } |
相关文章推荐
- javaWeb解决中文乱码问题终极办法字符流转换
- DataSupport.order 里变量名要与类里面的大小写保持一致,如submitTime 不能写为 submittime
- TCP-IP协议详解(1)网络协议概观
- linux学习之用户管理篇
- iOS项目开发实战——自定义设置导航栏和状态栏背景
- java_基础篇_01(补)
- matlab中关于转到二值化图像的问题
- javaWeb利用Filter解决中文乱码问题
- 絮叨絮叨看护机房之监控
- 絮叨絮叨看护机房之监控
- django开发博客(1) 入门
- H3CNE RIP原理
- [IOS]若干问题记录
- 接口回调
- Java-instanceof总结
- Java-instanceof总结
- 软件的图片缓存管理
- Spring 加载xml配置文件的方式 ApplicationContext
- Java-instanceof总结
- 接口回调