内存动态分配及指针

一、指针

  • C语言中的指针是一种数据类型,比如说我们用 int *a; 就定义了一个指针a,它指向一个int类型的数。但是这个指针是未初始化的,所以,一般的,我们都在创建指针时初始化它,以免出错,在还不吃的它该指向谁的时候,我们就这样创建
int *a=NULL;
/* NULL表示的地址是0*00000000 也就是空,实际上,NULL就等于0,只不过用于指针时,通常用NULL,便于阅读。 */

指针它所指的地方就是一个地址,他本身也是个变量,所以它本身也是个地址,所以也有指向指针的指针,我们称之为二级指针,举个例子:

  int a = 4;
  int *p = &a;
  int **ptr = &p;//二级指针
  printf("%d %d %d\n", a, *p, **ptr);
  /*输出4  4  4*/
  • 函数指针

    用法:
    对用户输入的n个整数进行排序,排序时用户可以指定排序方法,输入1代 表进行升序排序,输入2代表进行降序排序。
    用户选择相应的排序方法后,输入n及n个数,将排序结果进行输出。
#include<stdio.h>
#include<stdlib.h>
void sheng(int *a,int n);
void jiang(int *a,int n);
void (*p)(int *,int );//用来指向需要使用的函数
int main(void)
{
 int x,y,n,i;
 while( scanf("%d",&n),n!=0)
 {
  int a[1005];
  if(n==1)
  {
   scanf("%d",&y);
   for(i=0;i<y;i++)
   scanf("%d",&a[i]);
   p=sheng;
  }
  else if(n==2)
  {
   scanf("%d",&y);
   for(i=0;i<y;i++)
   scanf("%d",&a[i]);
   p=jiang;
  } 
   (*p)(a,y);
  printf("%d",a[0]);
  for(i=1;i<y;i++)
   printf(" %d",a[i]);
  printf("\n");
 }
 return 0;
}
void sheng(int *a,int n)
{
 int i,j,t;
 for(i=0;i<n;i++)
 {
  for(j=i+1;j<n;j++)
  {
   if(a[i]>a[j])
   {
    t=a[i];
    a[i]=a[j];
    a[j]=t;
   }
  }
 }
}
void jiang(int *a,int n)
{
 int i,j,t;
 for(i=0;i<n;i++)
 {
  for(j=i+1;j<n;j++)
  {
   if(a[i]<a[j])
   {
    t=a[i];
    a[i]=a[j];
    a[j]=t;
   }
  }
 }
}

内存分为静态内存(栈)和动态内存(堆),静态内存是系统分配的内存,不可更改,常量一般定义在此区域,动态内存为可变内存,因此变量存储在此区域。所谓的动态内存分配就是按照自己的想法分配内存,避免造成浪费。比如说我们定义了一个数组int a[600]但是,实际上我们要用到的只有100个int,那么
多余的空间创造出来就浪费了,而且在许多时候,我们并不知道最多要分配多少内存,所以,我们需要学习malloc函数来分配和释放部分内存。

  • malloc的用法
    首先,malloc函数是在stdlib.h这个头文件里面的,所以需要加上这个头文件。
    使用示例:
#include<stdio.h>
#include<stdlib.h>
int main(void)
{
      int *a;
     a = (int *)malloc(20 * sizeof(int));//分配20个int
     a[0] = 1;
     a[1] = 2;
     printf("%d %d\n", a[0], a[1]);
     free(a);
     return 0;
}

这段代码是使用malloc创建20个int的示例,可能你认为这和int a[20];没有区别,但是注意到后面的另一个函数free,这是释放内存的函数,也就是说,分配的这个空间可能用不到了,那么久释放掉,好让剩余的空间继续为其他东西所用。(在有些编译器里,也可以free数组,但是不推荐大家这样用


  • 学习上面的东西之后,我们就要学会使用结构体指针,下面是一个例子:
typedef struct NODE{
  int data;
}node;
node *st=(node*)malloc(sizeof(node));
st->data=5;

st->data就是指指针st所指向的结构体中的data。就和非指针的node st;st.data=5;一样,不过指针自然有指针的用处。

猜你喜欢

转载自blog.csdn.net/qq_44009311/article/details/88074206