您的位置:首页 > 其它

关于数组与指针的理解

2015-08-30 00:35 411 查看
2.4返回堆上一维空间

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;

}

2.4.2二级指针作为函数参数输出

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返回堆上二维空间

二维空间,并不一定就是二维数组,具有数组的访问形式。但己经远远不是数组 的定义了。

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;

}

2.5.2二级指针作返回值输出

★内存不连续

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);

}

2.5.3三级指针作为函数参数输出

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

高位在高地址 高位在低地址

2.文件读写

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这个结构体中的内容

3.求大小

#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;

}

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: