一.指针
1.1 认识它
1.2指针==地址
int a = 10; 变量名能访问,通过地址也能访问
&取地址运算符
*将地址内的值读出运算符
1.3指针变量==存放地址的变量
*的标识作用 只产生在指针变量定义或声明的时候
*的运算作用
变量访问的两种方式 直接访问
间接访问
1.4既然指针变量是存放别人地址的变量,那为什么要区分类型呢
决定指向空间的大小
决定增量
#include<stdio.h> int main() { int a = 10; int *p; p = &a; printf("变量名访问a:%d\n",a); printf("a的地址是:0x%p\n",&a); printf("地址访问a:%d\n",*(&a)); return 0; }
1.5为什么需要用指针
1.5.1封装一个函数,实现两个数的交换
#include<stdio.h> void chageData(int *pdata,int *pdata2) { int temp; temp = *pdata; *pdata = *pdata2; *pdata2 = temp; } int main() { int data = 10; int data2 = 20; printf("交换前:data=%d,data2=%d\n",data,data2); chageData(&data,&data2); printf("交换后:data=%d,data2=%d\n",data,data2); return 0; }
1.5.2.指针指向固定的区域
#include<stdio.h> int main() { int data = 10; printf("data的地址为:0x%p\n",&data); int *p = (int *)0x000000000061FE1D; //注意0x printf("p的地址为:%p\n",p); return 0; }
1.5.3输入三个数a,b,c;要求不管怎么输入,在输出的时候,a,b,c就是由大到小的顺序输出,用函数封装实现
#include<stdio.h> void threeMaxData(int *a,int *b,int *c) { int temp; if(&a < &b){ temp = *a; *a = *b; *b = temp; } if(&b < &c){ temp = *b; *b = *c; *c = temp; } if(&a < &b){ temp = *a; *a = *b; *b = temp; } } int main() { int a; int b; int c; puts("请输入a,b,c"); scanf("%d%d%d",&a,&b,&c); threeMaxData(&a,&b,&c); printf("输出为:a=%d,b=%d,c=%d",a,b,c); return 0; }
1.6通过指针引用数组
定义一个指针变量指向数组
int a[10]
int *p ;
p = &a[0]; //p = a
指针增量和数组的关系
#include<stdio.h> int main() { int arr[3] = {1,2,3}; int *p; p = arr; //数组名就是数组的首地址 for(int i = 0;i<3;i++){ printf("%d ",*(p+i)); } return 0; }
1.7通过指针引用数组的元素
下标法
指针法 1.偏移
2.取内容 见怪不乖的数组名 a++可行否 常量指针
指针变量
sizeof的时候
取地址的时候
a+1呢?
#include<stdio.h> int main() { int arr[3] = {1,2,3}; int *p; p = arr; //数组名就是数组的首地址 for(int i = 0;i<3;i++){ printf("%d ",*p++); } return 0; }
两种方法效率的对比,对于使用指针和数组下标的选择:系统在使用数组下标对数组成员变量进行访问时,开销比较大,指针的访问效率是远远大于数组名的访问效率的,但是只有在指针正确访问时,才成比下标法更有效率。下标法更加容易理解,在可读性方面,也更加的具有优势,具体怎么选择,也没有一定的说法。
1.8练习题
1.8.1函数封装数组初始化,遍历
#include<stdio.h> void initArry(int *arr,int size) { int i; for(i=0;i<size;i++){ printf("请输入第%d个元素的数据:\n",i+1); scanf("%d",arr); arr++; } } void printArry(int *arr,int size) { int i; for(i=0;i<size;i++){ printf("%d ",*arr); arr++; } } int main() { int arry[5]; int size = sizeof(arry)/sizeof(arry[0]); initArry(arry,size); printArry(arry,size); return 0; }
1.8.2数组反转
#include<stdio.h> void reverseArry(int *parry1,int *parry2,int len) { int i; int j = 0; for(i=len-1;i>=0;i--){ parry2[j] = parry1[i]; j++; } } void printArry(int *parry2,int len) { for(int i = 0;i<len;i++){ printf("%d ",parry2[i]); } } int main() { int arr1[5] = {9,56,323,6,7}; int len = sizeof(arr1)/sizeof(arr1[0]); int arr2[len]; reverseArry(arr1,arr2,len); printArry(arr2,len); return 0; }
标签:temp,int,C语言,学习,地址,第五天,include,data,指针 From: https://www.cnblogs.com/Lynchteacher/p/17284928.html