C语言之指针
程序员文章站
2024-03-08 09:40:28
...
- 指针:一个变量的存储单元的首地址。
指针变量:专门存放指针的变量叫指针变量。 - & 取地址运算符;* 指针运算符(“间接访问”运算符);
&a 是变量a的地址 &a 是变量a的地址;
指针变量作为函数参数——地址传递;
特点:共享内存,“双向”传递。
int array[10];
int *p;
p=array; <=> p=&array[0];
或 int *p=&array[0];
- 1、int *p1, *p2; 与 int p1, p2;
2、指针变量名是p1,p2 ,不是p1,*p2
3、指针变量只能指向定义时所规定类型的变量
4、指针变量定义后,变量值不确定,应用前必须先赋值 - 指针变量的关系运
若p1和p2指向同一数组,则
—p1<p2 表示p1指的元素在前
—p1>p2 表示p1指的元素在后
—p1==p2 表示p1与p2指向同一元素
若p1与p2不指向同一数组,比较无意义 - 字符串的引用方式
—用字符数组存放一个字符串,可以通过数组名和格式声明“%s”输出该字符串,也可以通过数组名和下标引用字符串中一个字符。
—用字符指针变量指向一个字符串常量,通过字符指针变量引用字符串常量。
#include <stdio.h>
int main()
{ char *string="I love China! ";
printf("%s\n",string);
printf("%c\n",string[7]);
return 0;
}
- 字符指针作函数参数
如果想把一个字符串从一个函数“传递”到另一个函数,可以用地址传递的办法,即用字符数组名作参数,也可以用字符指针变量作参数。
#include <stdio.h>
int main()
{void copy_string(char from[],char to[]);
char a[]="I am a teacher.";
char b[]="you are a student.";
printf("a=%s\nb=%s\n",a,b);
printf("copy string a to string b:\n");
copy_string(a,b);
printf("a=%s\nb=%s\n",a,b);
return 0;
}
void copy_string(char from[], char to[])
{
int i=0;
while(from[i]!='\0')
{
to[i]=from[i];
i++;
}
to[i]='\0';
}
- 函数指针
如果在程序中定义了一个函数,在编译时,编译系统为函数代码分配一段存储空间,这段存储空间的起始地址,称为这个函数的指针。
定义返回指针值的函数的一般形式为
— 类型名 *函数名(参数表列);
定义指向函数的指针变量的一般形式为
数据类型 (*指针变量名)(函数参数表列);
int (*p)(int,int);
指向函数的指针变量的一个重要用途是把函数的地址作为参数传递到其他函数
8.
- 动态内存分配
1.C语言允许建立内存动态分配区域,以存放一些临时用的数据,这些数据需要时随时开辟,不需要时随时释放。这些数据是临时存放在一个特别的*存储区,称为堆区。
2.非静态的局部变量是分配在内存中的动态存储区的,这个存储区是一个称为栈的区域。
——对内存的动态分配是通过系统提供的库函数来实现的,主要有malloc,calloc,free,realloc这4个函数。
需加上#include<stdlib.h>头文件
void *malloc(unsigned int size);
void *calloc(unsigned n,unsigned size);
void free(void *p);
void *realloc(void *p,unsigned int size);
- void *指针是一种特殊的指针,不指向任何类型的数据,如果需要用此地址指向某类型的数据,应先对地址进行类型转换。可以在程序中进行显式的类型转换,也可以由编译系统自动进行隐式转换。