一文搞懂C/C++中指针那些事(上篇)
来源:互联网 发布:mac mail 设置模板 编辑:程序博客网 时间:2024/05/14 21:23
一 指针变量
1.间接存取
指针变量的值为地址;普通变量的值为数据;其中“*”为指针运算符。&是地址操作符,用来引用一个内存地址。通过在变量名字前使用&操作符,我们可以得到该变量的内存地址。
针对内存数据的存取的两种方法:直接存取和间接存取,所谓的间接存取是指为了存取一个变量值,首先从存放变量地址的指针变量单元中取得该变量的存储地址,然后再从该地址中存取该变量值。直接上例子:
int x,*s; //定义了整形变量x;还定义了一个用于存放整形变量所占内存地址的指针变量ss = &x; //将x所占的内存地址取出赋给指针变量s*s = 3; //在s所指向的内存地址中赋以整型值3//等价于int x; x = 3;
2.指针变量定义与引用
一般形式: 类型标识符 *指针变量名
int *m,*n;double *p,*q;int *uninit; // int指针未初始化int *nullptr = NULL; // 初始化为NULLvoid *vptr; // void指针未初始化
注:C语言中,数组元素的下标是从0开始的。
例:
int main(){ double x=0.11,y=0.1; double *p,*q; p=&x;q=&y; printf("&x=%u,&y=%u\n",&x,&y); //输出变量x与y的地址 printf("p=%u,q=%u\n",p,q); //输出指针变量存放的地址 printf("x=%f,y=%f\n",x,y); //输出X与y的值 printf("*p=%f,*q=%f\n",*p,*q); //输出指针变量p与q所指向的变量值,p是指针变量,不能说*p是指针变量}
3.指针变量作为函数参数
例:交换两个变量值
void swap(int **a,int **b){ int *t; t = *a; *a = *b; *b = t;}int main(){ int i=3,j=5; int *p = &i, *q = &j; printf("%d,%d,%d,%d\n",*p,*q,i,j); swap(&p,&q); //实参p与q的指针单元的地址传递给了形参a与b, printf("%d,%d,%d,%d\n",*p,*q,i,j); getchar();}
4.指向指针的指针
指向指针的指针就是指向指针变量的指针。
int x,*q,**p;q = &x;p = &q;**p = 3;//等价于int x; x=3;
例:交换变量的值
void swap(int **a,int **b){ int *t; t = *a; *a = *b; *b = t;}int main(){ int i=3,j=5; int *p = &i, *q = &j; printf("%d,%d,%d,%d\n",*p,*q,i,j); swap(&p,&q); //实参p与q的指针单元的地址传递给了形参a与b, printf("%d,%d,%d,%d\n",*p,*q,i,j); getchar();}
总结:这里可以把指针、引用和值的关系类比为信封、邮箱地址和房子。一个指针就好像是一个信封,我们可以在上面填写邮寄地址。一个引用(地址)就像是一个邮件地址,它是实际的地址。取值就像是地址对应的房子。我们可以把信封上的地址擦掉,写上另外一个我们想要的地址,但这个行为对房子没有任何影响。
二 指针数组
指针数组定义如下:类型标识 *数组名[数组长度说明]
例如: int *p[4];
int main(){ int a[5]={1,2,3,4,5}; int *num[] = {&a[0],&a[1],&a[2],&a[3],&a[4]}; int **p,k; p = num; //等价于p=&num[0] for(k=0;k<5;k++) { printf("%5d",**p); p++; } printf("\n"); getchar();}
程序运行结果 : 1 2 3 4 5
以下四个说明语句是等价的:
int a[10],*p=a;int a[10],*p=&a[0];int a[10],*p; p=a;int a[10],*p; p=&a[0];
三 指针与结构体
就像数组一样,指向结构体的指针存储了结构体第一个元素的内存地址。与数组指针一样,结构体的指针必须声明和结构体类型保持一致,或者声明为void类型。
struct person { int age; char *name;};struct person first;struct person *ptr; first.age = 26;char *fullname = "full name";first.name = fullname;ptr = &first; printf("age=%d, name=%s\n", first.age, ptr->name);
第1至6行声明了一个person结构体,一个变量指向了一个person结构体和指向person结构体的指针。
第8行为age成员赋了一个int值。
第9至10行我们声明了一个char指针并赋值给一个char数组并赋值给结构体name成员。
第11行我们把一个person结构体引用赋值给结构体变量。
第13行我们打印了结构体实例的age和name。这里需要注意两个不同的符号,’.’ 和 ‘->’ 。结构体实例可以通过使用 ‘.’ 符号访问age变量。对于结构体实例的指针,我们可以通过 ‘->’ 符号访问name变量。也可以同样通过(*ptr).name来访问name变量。
- 一文搞懂C/C++中指针那些事(上篇)
- C标准中关于空指针的那些事
- C语言指针的那些事(一)
- C语言指针的那些事(二)
- 关于C指针的那些事
- C指针与const的那些事
- 一文搞懂Matlab画图那些事(上篇)
- 【C/C++和指针】printf 的那些事
- 【C/C++和指针】printf 的那些事
- C语言的那些小秘密之指针(一)
- C语言的那些小秘密之指针(二)
- C语言的那些小秘密之指针(三)
- C语言的那些小秘密之指针(四)
- C语言的那些小秘密之【指针(一)】
- C语言的那些小秘密之【指针(二)】
- C语言的那些小秘密之【指针(三)】
- C语言的那些小秘密之【指针(四)】
- C语言中关于内存那些事
- 用javamail实现一个简单的邮件发送
- 《 Mining of Massive Datasets》学习笔记之 Finding Similar Items
- 107. Binary Tree Level Order Traversal II
- Error setting expression 'tel' with value '[Ljava.lang.String;@38ec843'和'user.tel' with value
- C#执行batwindows批处理
- 一文搞懂C/C++中指针那些事(上篇)
- studyjams notes 1B--width and height
- 第七周实践项目3————用多文件组织多个类的程序
- 二维数组查找问题
- 毕设笔记--MyEclipse10与MySQL建立数据库连接
- Android Studio常用快捷键及设置
- 欢迎使用CSDN-markdown编辑器
- 删除链表中重复的结点
- Ceph存储系统(ceph安装,inkscope安装)--未完