指针是一个值为内存地址的变量。

变量是一块内存空间,指针是变量,是用来存储内存地址的变量。

#include <stdio.h>
#include <stdlib.h> int main()
{
int num = 9;
printf("num变量的地址为:%p\n",&num); // p表示指针占位符
return 0;
}

#include <stdio.h>
#include <stdlib.h> int main()
{
int num = 9;
int * ptr_num = &num;
printf("num变量的地址为:%p\n",ptr_num); // p表示指针占位符
return 0;
}

根据地址,找到空间!然后操作空间!

变量地址也占用空间,只不过占用的不是内存空间,而是寄存器的存储空间。

内存地址实际上是一种偏移量,存储于段寄存器中。内存地址只是一种抽象,不是真正的物理内存地址,而是逻辑地址。由逻辑地址寻找到物理地址需要经过 逻辑地址->线性地址->物理地址 转换过程,而这些过程都是基于寄存器完成的。

#include <stdio.h>
#include <stdlib.h> int main()
{
int num = 9;
int * ptr_num = &num;
* ptr_num = 10;
printf("* ptr_num的值为:%d\n",* ptr_num);
printf("num的值为:%d\n",num); // p表示指针占位符
return 0;
}

指针的类型,跟他所指向的数据结构有关。

基本类型的指针指向基本类型的数据结构。

比如:char * p; int *p; float *p; double *p;

分别指向的是char, int ,float, double 类型的变量。

#include <stdio.h>
#include <stdlib.h> int main()
{
int num1 = 1024;
int num2 = 2048;
int * ptr1;
int * ptr2;
ptr1 = &num1;
ptr2 = &num2;
printf("num1的值是%d\tnum1的地址是:%p\n",num1,ptr1);
printf("num2的值是%d\tnum2的地址是:%p\n",num2,ptr2); // 将变量1的值赋给变量2
num2 = num1;
printf("num1的值是%d\tnum1的地址是:%p\n",num1,ptr1);
printf("num2的值是%d\tnum2的地址是:%p\n",num2,ptr2); *ptr2 = *ptr1; // 等价于 num2 = num1
printf("num1的值是%d\tnum1的地址是:%p\n",num1,ptr1);
printf("num2的值是%d\tnum2的地址是:%p\n",num2,ptr2); // 地址变了,num1,num2不受影响
ptr2 = ptr1;
printf("num1的值是%d\tnum1的地址是:%p\n",num1,ptr1);
printf("num2的值是%d\tnum2的地址是:%p\n",num2,ptr2); return 0;
}

一个变量就是一个内存空间,内存一定是有物理地址的!指针就是保存变量内存物理地址的变量!

指针与数组

数组是一个连续的内存空间,数组名就是它的首地址。

#include <stdio.h>
#include <stdlib.h> int main()
{
double score[] = {98,87,65,43,76};
printf("数组的首地址:%p\t 数组手元素的地址 :%p\n",score,&score[0]); }

数组名就是数组元素的首地址。

#include <stdio.h>
#include <stdlib.h> int main()
{
int i;
double score[5] = {98,87,65,43,76};
double * ptr_score;
ptr_score = score;
for (i=0;i<5;i++) {
printf("%.2lf\n",*ptr_score++); // 通过首地址取找数组元素的值
} for (i=0;i<5;i++) {
printf("%.2lf\n",score[i]);
} }

等价的!double类型的数据,每个数据移动了8个字节。物理地址是一个十六进制的数字。

#include <stdio.h>
#include <stdlib.h> int main()
{
int array[] = {15,20,25,30,35};
int i;
int * ptr_array = array;
for (i = 0;i<5;i++) {
printf("第%d个元素的值为%d,地址为%p\n",i,*ptr_array,ptr_array);
ptr_array ++ ;
} /*
第0个元素的值为15,地址为0028FF0C
第1个元素的值为20,地址为0028FF10
第2个元素的值为25,地址为0028FF14
第3个元素的值为30,地址为0028FF18
第4个元素的值为35,地址为0028FF1C
*/
return 0;
}

int型地址间隔4个字节。

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define N 7 int main()
{
int array[N] = {15,20,25,30,35,40,90};
int i;
int temp;
// 实现数组的逆序
// 数组的首尾元素进行交换
for (i = 0;i<floor(N/2);i++) {
temp = array[i];
array[i] = array[N-i-1];
array[N-i-1] = temp;
} for (i = 0;i<N;i++) {
printf("交换后第%d元素的值为:%d\n",i,*(array + i));
}
return 0;
}

逆序数组,找规律是写程序必备的技能!

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define N 7 int main()
{
int array[N] = {15,20,25,30,35,40,90};
int i;
int temp; int * ptr_head;
int * ptr_foot;
ptr_head = &array[0];
ptr_foot = &array[N-1]; // 实现数组的逆序
// 数组的首尾元素进行交换
for (i = 0;i<floor(N/2);i++) {
temp = * ptr_head;
* ptr_head = * ptr_foot;
* ptr_foot = temp;
ptr_head ++;
ptr_foot --;
} for (i = 0;i<N;i++) {
printf("交换后第%d元素的值为:%d\n",i,*(array + i));
}
return 0;
}

指针实现数组逆序!

二维数组与指针

首地址

&a[0][0]

有祥有略!有精有简!有的放矢有的取舍去学习!

何为二维数组,如何理解?由n个一维数组组成!

#include <stdio.h>
#include <stdlib.h>
#include <math.h> int main()
{
int i,j;
double score[5][3] = {
{55,56,57},
{58,59,60},
{61,62,63},
{64,65,66},
{67,68,69}
}; // 传统的访问方式
for (i = 0;i < 5;i++) {
for (j = 0;j <3 ;j++) {
printf("%.2lf\t",score[i][j]);
} printf("\n");
} printf("=================================\n"); // 指针的方式访问
for (i = 0;i < 5;i++) {
for (j = 0;j <3 ;j++) {
// printf("%.2lf\t",*(score[i] + j));
printf("%.2lf\t",*(*(score+i) + j));
} printf("\n");
} return 0;
}

*(*(score + i) + j) 获取二维数组的公式!

老九语录,会赋值,会打印就差不多了!多练习练习再做个小项目就可以了!

最新文章

  1. C语言static
  2. 多个Activity相互调用和Intent
  3. jQuery-1.9.1源码分析系列(五) 回调对象
  4. VS2012 MVC4 学习笔记-概览
  5. mysql查看存储过程
  6. RFID读卡器设置卡
  7. Ubuntu14.0.4 64位 ADT 连接手机调试问题
  8. Codeforces Round #277 (Div. 2) 题解
  9. boost::asio async_write也不能保证一次发完所有数据 一
  10. 安装SQL Server 2008 - 初学者系列 - 学习者系列文章
  11. 使用SyncToy 同步两台机器上的文件夹
  12. hdu4825 01字典树+贪心
  13. python:解析js中常见的 不带引号的key的 json
  14. python图形用户
  15. G1垃圾收集器的实现原理
  16. dos脚本
  17. 使用qemu模拟调试内核和debian根文件系统
  18. 2.App爬取相关库的安装(安装mitmproxy)
  19. jemalloc总结
  20. javascript浮点数转换成整数三种方法

热门文章

  1. B - Expression
  2. Session版购物车+MVC局部刷新
  3. html行级元素和块级元素以及css转换
  4. 错误:android.util.SuperNotCalledException
  5. 将mysql默认编码改为UTF8
  6. redis的跳跃表
  7. UBuntu安裝使用PIP
  8. (转)基于MVC4+EasyUI的Web开发框架形成之旅--MVC控制器的设计
  9. 三大Flex布局用法(转载)
  10. JQueryEsayUI的datagrid分页