目录

1.二级指针

 2.malloc()函数

 3.calloc()函数

4.realloc()函数

 5.容易混淆的的指针小知识点


1.二级指针

int **p;//定义一个二级指针
int *q[10]; //定义一个指针数组,数组中每个元素是一个指针

 2.malloc()函数

C 库函数 void *malloc(size_t size) 分配所需的内存空间,并返回一个指向它的指针。

p = (类型*)malloc(sizeof(int) * 10) 

这里是是申请一个10个int空间大小的空间 

之后要进行if条件判读是否为空指针

重点是malloc后需要用memset()对空间进行初始化

memet()

C 库函数 void *memset(void *str, int c, size_t n) 复制字符 c(一个无符号字符)到参数 str 所指向的字符串的前 n 个字符。

声明 void *memset(void *str, int c, size_t n)

记得用完这个空间后需要释放空间,否则可能出现内存泄漏

free(p); 

 3.calloc()函数

C 库函数 void *calloc(size_t nitems, size_t size) 分配所需的内存空间,并返回一个指向它的指针。malloc 和 calloc 之间的不同点是,malloc 不会设置内存为零,而 calloc 会设置分配的内存为零。

声明

void *calloc(size_t nitems, size_t size)

 

#include <stdio.h>
#include <stdlib.h>
 
int main()
{
   int i, n;
   int *a;
 
   printf("要输入的元素个数:");
   scanf("%d",&n);
 
   a = (int*)calloc(n, sizeof(int));
   printf("输入 %d 个数字:\n",n);
   for( i=0 ; i < n ; i++ ) 
   {
      scanf("%d",&a[i]);
   }
 
   printf("输入的数字为:");
   for( i=0 ; i < n ; i++ ) {
      printf("%d ",a[i]);
   }
   free (a);  // 释放内存
   return(0);
}

4.realloc()函数

C 库函数 void *realloc(void *ptr, size_t size) 尝试重新调整之前调用 malloc 或 calloc 所分配的 ptr 所指向的内存块的大小。

声明

void *realloc(void *ptr, size_t size)

 5.容易混淆的的指针小知识点

1.  a是一维数组名,a+1,往后挪了一个元素的地址,a是一级指针,挪一级指针挪了一个元素
2. a是二维数组名,a+1往后挪了一行元素的地址,a是二级指针,挪二级指针挪了一行元素
3.  a是二维数组名,&a+1往后挪了整个数组的地址,a是二级指针,&a是三级指针,挪三级指针挪了整个数组

1. 计算sizeof(二维数组名),计算的是整个数组占的空间大小,
2. 计算sizeof(一维数组名), 计算的是一维数组占的空间大小
3. 计算sizeof(二维数组的行地址),计算的是二维数组中某行占空间大小
4. 计算sizeof(无论什么地址),计算的是地址占空间大小,与系统位数有关64位系统是8个字节,32位系统是4个字节