指针运算
//
指针加减整数
指针 -(减) 指针
指针的关系运算
指针加减整数
//#include<stdio.h>
//int main()
//{
// int arr[10] = {1,2,3,4,5,6,7,8,9,10};
// int i = 0;
// int sz = sizeof(arr) / sizeof(arr[0]);
// int* p = arr;
// for (i = 0; i < sz; i++)
// {
// printf("%d ",*(p+i));// 1 2 3 4 5 6 7 8 9 10
// }
// printf("\n");
// for (i = sz-1; i >= 0; i--)
// {
// printf("%d ", *(p + i));//10 9 8 7 6 5 4 3 2 1
// }
// return 0;
//}
//
指针 -(减) 指针
//#include<stdio.h>
//int main()
//{
// char ch[5] = { 0 };
// int arr[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
// printf("%d\n",&arr[9] - &arr[0]);//指针 - 指针 得到是指针和指针之间( &arr[0]~&arr[9] //左开右闭区间)的元素的个数
// // 输出为 9
//
// printf("%d\n", &arr[9] - &ch[0]);//这种写法error,因为指针减指针,两者必须是同一块空间里的。
// return 0;
//}
//#include<stdio.h>
//int my_strlen(char* arr)
//{
// char* start = arr;
// char* end = arr;
// while (*end != '\0')//循环结束后 end == '\0' == arr[3]
// {
// end++;
// }
// return end - start;//arr[3] - arr[0] 左开右闭
// // 第四个元素减去 第一个元素 == 3
//}
//
//int main()
//{
// char arr[] = "bit";
// int len = my_strlen(arr);
// printf("%d\n",len);
// return 0;
//}
指针的关系运算
//#define N_VALLUES 5
//#include<stdio.h>
//
//int main()
//{
// float values[N_VALLUES];
// float *vp;
// // 1.优先(priority)
// for (vp = &values[ N_VALLUES/* 5 */ ] /*第六个元素*/; vp > &values[0]/*指针是可以比较大小的*/ ; /*省略了*/ )
// { //允许指向数组元素的指针与指向数组最后一个元素后面的那个内存位置的指针比较;
//
// *--vp = 0;// 省略部分在这
// }
//
// 2.
// //for (vp = &values[N_VALLUES-1]; vp >= &values[0];vp--)//C语言的标准,并不保证它能运行
// //不允许与指向第一个元素之前的那个内存位置进行比较
//
// //C语言标准规定:
// //允许指向数组元素的指针与指向数组最后一个元素后面的那个内存位置的指针比较;
// //但不允许与指向第一个元素之前的那个内存位置进行比较
//
// //{
// // *vp = 0;// 省略部分在这
// //}
// return 0;
//}
指针和数组
数组
//#include<stdio.h>
//int main()
//{
// int arr[10] = { 0 };
// printf("%p\n",arr);//打印首元素地址
// printf("%p\n", &arr);//打印数组的起始地址
// printf("%p\n", &arr[0]);//打印首元素地址
// //在绝大部分情况,数组名表示是首元素地址
// //但有两种情况例外
// // &数组名,arr代表的是整个数组的起始地址。
// //sizeof(数组名),arr代表的是整个数组,sizeof计算的是整个数组的大小,单位byte
//
// printf("------------------------\n");
// printf("%p\n", &arr[0]); // 00F3F8E8 首地址
// printf("%p\n", &arr[0] + 1);//00F3F8EC加了4字节,因为数组元素类型 int
//
// printf("%p\n", &arr);// 00F3F8E8 数组的起始地址
// printf("%p\n", &arr + 1);// 00F3F910 加了40字节(2 * pow(16,1) + 8 * pow(16,0)),
// //即跳过一个数组
//
// return 0;
//}
指针
//#include<stdio.h>
//int main()
//{
// int arr[10] = { 0 };
// int* p = arr;// 指针变量p 存的是 arr首地址
// int i = 0;
// for (i = 0; i < 10; i++)
// {
// printf("%p........%p\n",p+i/*根据数组首元素地址找到我们想要打印的元素地址*/,&arr[i]);// 两者是等价de
// //如果输出是 %d 型,输出元素,需要解引用操作符*
// //例: *(p+i) 或者 &arr[i]
// }
// return 0;
//}
二级指针、
//#include<stdio.h>
//int main()
//{
// int a = 10;
//
// //pa 一级指针变量,变量的创建,需要在内存中开辟空间
// int * pa = &a;//一级指针类型 ;最右边的*,告诉我们 pa 是一个指针
// // 而int,告诉我们 pa 指向的那个对象的类型为 int
//
// int* * ppa = &pa;// 二级指针 最右边的*,告诉我们 ppa 是一个指针
// // 而int*,告诉我们 ppa 指向的那个对象的类型为 int*
//
// int** * pppa = &ppa;// 三级指针 最右边的*,告诉我们 pppa 是一个指针
// // 而int**,告诉我们 pppa 指向的那个对象的类型为 int**
//
// // n 级指针,可按照上表达式的规律写出
//
// //二级指针使用方法
// printf("%d\n", **ppa);//*ppa == pa ; *(pa)= a ;**ppa == a
// // 上下两个表达式 输出为 10
// printf("%d\n", a);
//
//
// **ppa = 20;
// printf("%d\n", **ppa);
// printf("%d\n", a);//两个表达式输出 是 20
// return 0;
//}
指针数组 - 本质上是一个数组 :就是 数组是主语(subject), 指针是个形容词(adjective)
指针数组 是 存放指针 的数组 //整形数组 - 存放整形 // 字符数组 - 存放字符
#include<stdio.h>
int main()
{
int a = 10;
int b = 20;
int c = 30;
// int* a = &a;
// int* b = &b;
// int* c = &c;
int* arr2[3] = { &a,&b,&c };//它就是一个指针数组
int i = 0;
for (i = 0; i < 3; i++)
{
printf("%p\n", arr2[i]);
printf("%d\n", *(arr2[i]));
printf("\n");
}
return 0;
}
数组指针 - 本质上是一个指针:就是 指针 是主语(subject), 数组是个形容词(adjective)
//int* p[5];
//是一个大小为5且存放整形指针的数组
//int(*p)[5];
//数组指针 通过指针和解引用数组,p先*与结合,说明p不是数组,指向一个大小为5的数组,所以int(*p)[5]即为一个数组指针