指针编程之道

来源:互联网 发布:相关系数矩阵怎么看 编辑:程序博客网 时间:2024/06/05 19:43
指针编程之道

1、分类:变量指针、数组指针
(1)变量指针
char str[]="china is beautiful"; 
char *p;
p=str;
p=&str[0];
注:*p=5 赋值,a=*p 取值,&b 取址
(2)指针数组
char *p[]={"what","is","that"};

小猪:定义函数若在main()函数之后,则需要先声明该函数;若在main()之前则不用声明
2、指向结构体的指针
typedef struct
{
     char head;
     char end;
     char data[3];
}stu;
(1) stu pp; //定义结构体变量
      stu *p; //定义结构体指针变量
(2) pp.head; //结构体变量引用
      p->head; //结构体指针变量引用
 
stu txbuf[3]={{'a','b','c','d','e','f'},{},{}};
stu *p=txbuf;
printf("%c",p[0].head);
 
小猪:程序中使用结构体类型指针引用结构体变量的成员,需要通过C提供的函数malloc()来为指针分配安全的地址。函数sizeof()返回值是计算给定数据类型所占内存的字节数。
struct stu *student; //定义结构体类型指针
student=malloc(sizeof(struct stu)); //为指针变量分配安全的地址
3、函数指针:即函数的入口地址,一个函数只有一个指针,不能通过指针的移动访问函数体中的语句。
void output();
int main()
{
     void (*p_output)();  //声明函数指针,括号不能省略
     p_output=output;  //指向定义的函数
     (*p_output)();  //通过函数指针调用函数
}

4、指针函数:返回值是指针的函数
定义: int *p_fun();  //由于()优先级高于*,所以该定义是一个函数

5、main返回值
单进程系统:可以为void main();或int main();
多进程系统:int main();该返回值返回给操作系统
main两种定义方式:
     int main(void);   和    int main(int argc,char *argv[]);
小猪:二维数组,只定义未初始化,则元素值是未知的;定义并初始化部分元素,则未定义的值为0.

6、指针的指针:即指向指针的指针
char str[]={};
char *p=str;

char *str[]={"china","is"};  //该定义一般都是用于对字符串操作
char **p=str;
7、二维数组
grid[i][j]: grid是grid[0]的地址,grid[0]是grid[0][0]的地址。
则,grid[i] <--> *(grid+i)
      grid[i][j] <---> *(grid[i]+j)
所以:grid[i][j]的两种表达形式
*(grid[i]+j)  和  *(*(grid+i)+j)

8、动态分配内存
(1)void *malloc(unsigned int num_bytes);  //动态分配num_bytes字节的内存
(2)void *calloc(unsigned num,unsigned size);  //分配num*seze大小的内存
(3)void *realloc(*ptr,size_t size);  //对ptr指向的内存,重新分配size大小的内存
9、释放内存
void free(void *ptr);  //释放ptr指向的内存

小猪:内存释放只是把该内存的数据变为无效数据,但指针仍指向该内存,所以,释放内存的同时要将ptr=null

10、const用法
(1)const int *p <----->int const *p :指向整型常量的指针,p可以变,但*p不可以变
(2)int * const p :p是指针常量,p不可以改变,但*p可以改变
(3)const int * const p :p和*p均不可改变

小猪:const位于*左侧,则是修饰指针所指向的变量;位于右侧,则是修饰指针本身。
原创粉丝点击