1.指向指针的指针
指针变量在内存中会占用一定的空间。
可以定义指针来保存指针变量的地址值。
指针在本质上也是变量
对于指针也同样存在传值调用与传址调用
案例:重置动态空间的大小(指针可以用来解决 ”单向传递” 的问题)
#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;
}
2. 二维数组与二级指针
#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);
int len1 = sizeof(a) ;
printf("len=%d\n", len1);
int len2 = sizeof(*a);
printf("len=%d\n", len2);
int len3 = sizeof(&a);
printf("len=%d\n", len3);
int len5 = sizeof(**a);
printf("len=%d\n", len5);
int len4 = sizeof(a) / sizeof(*a);//求的是行数
printf("len=%d\n", len4);
int len4 = sizeof(a) / sizeof(**a);//二维数组的个数
printf("len=%d\n", len4);
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]);
}
解析:
如何动态申请二维数组(以二维指针模拟)
#include <stdio.h>
#include <stdlib.h>
#define Malloc(type,n) (type *)malloc((n)*sizeof(type))
int main(int argc, char **argv)
{
printf("%d\n", sizeof(int *)); //4
int **array;
int i, j, row, column;
if (argc != 3)
{
printf("Run me with 2 parameters--rows & columns. For example:\n%s 3 4\nreturns 3 rows 4 columns array\n", argv[0]);
exit(1);
}
row = atoi(argv[1]);
column = atoi(argv[2]);
array = Malloc(int *, row);
for (i = 0; i<row; i++)
{
array[i] = Malloc(int, column);
}
//validation
for (i = 0; i<row; i++)
{
for (j = 0; j<column; j++)
{
array[i][j] = i;
printf("%4d", array[i][j]);
}
printf("\n");
}
for (i = 0; i<row; i++)
free(array[i]);
free(array);
return 0;
}
解析: