一、指针
- 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*/
#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;一样,不过指针自然有指针的用处。