建网站程序怎么办,成都市建设路小学网站,网站群建设成本分析,网站建站网站的什么是指针#xff1f; 在计算机科学中#xff0c;指针#xff08;Pointer#xff09;是编程语言中的一个对象#xff0c;利用地址#xff0c;它的值直接指向存在电脑存储器中的另一个地方的值。由于通过地址能找到所需的变量单位#xff0c;可以说#xff0c;地址指向…什么是指针 在计算机科学中指针Pointer是编程语言中的一个对象利用地址它的值直接指向存在电脑存储器中的另一个地方的值。由于通过地址能找到所需的变量单位可以说地址指向该变量单元。因此降低至形象化的称为“指针”。意思是通过它能找到以它位地址的内存单元。
图解指针 代码解析
#include stdio.hint main()
{int a 20;
//在内存中开辟一段空间int *p a;
//“a”将变量a的地址取出使用“”取地址操作符
//将a的地址存放在p变量中p就是一个指针变量return 0;
}总结 指针就是变量用来存放地址的变量。所以说存放在指针中的值都会被当做地址来处理
为什么存在指针
生活中例子
现实生活中我们管理土地的方式是 国家→省→市→县区→街道→楼→房间 这样做我们可以很好地将土地分区管理然后通过一个地址就能找到对应的位置。可以方便有快捷的管理。
其实计算机中的内存管理也是采用了这样的思路 将计算机中的内存分成很多小单元每个单元都对应一个独一无二的地址这样就一个地址表示一块空间。
指针的运算
指针±整数
#include stdio.hint main()
{int a 10;char *pc (char*)n;int *pi n;printf(%p\n, n); //0x00FFF121printf(%p\n, pc); //0x00FFF121printf(%p\n, pc1); //0x00FFF122printf(%p\n, pi); //0x00FFF121printf(%p\n, pi1); //0x00FFF125return 0;
}指针-指针
用模拟实现strlen解析
int my_strlen(char *s)
assert(s NULL);
{char *p s;while(*p \0)p;return p-s;
}总结 指针的类型决定了指针向前或者向后走一步有多大也就是说指针的类型决定了在对指针进行使用时的权限有多大能操作几个字节 指针之间相加减是在计算两个指针之间相差多少元素并且只能在同一块空间中进行。 在关系运算中有以下标准规定 允许指向数组元素的指针与指向数组最后一个元素后面的那个内存位置的指针比较但是不允许与指向第一个元素之前的那个内存位置的指针进行比较
二级指针 指针变量也是变量是变量就有地址那么指针变量的地址存放在哪里 这就是二级指针
图解二级指针 a的地址存放在pa中pa的地址存放在ppa中。所以说pa是一级指针而ppa是二级指针。通过对ppa中的地址解应用可以找到pa所以*ppa访问的就是pa再对pa进行解引用就可以找到a也就是说**ppa就是a
指针表达式解析 当有代码
char ch a;
char *cp ch;下面的代码那些可以做左值那些可以做右值
ch; //ch是地址常量不能做左值只能做右值
cp; //cp是变量可以做左值也可以做右值
cp; //cp是地址常量不能做左值只能做右值
*cp1; //*cp1表达式的结果是常量不能做左值但可以做右值
*(cp1); //*(cp1)表示的是ch之后的一块空间可以做左值也可以做右值
cp; //cp在c语言中变量的前置不能作为左值只可以作为右值但在c中变量的前置可以作为左值
cp; //cp在c语言中变量的后置不能作为左值只可以作为右值
*cp; //*cp表示的是ch的下一块空间可以做左值也可以做右值
*cp; //*cp中是后置的是先用*cp在做所以既可以做左值也可以做右值
*cp; //*cp表达式是对*cp的前置所以不能做左值只能做右值
(*cp); //(*cp)表达式是对*cp的后置所以不能做左值只能做右值
*cp; //*cp是对ch的下一块空间的内容做的前置所以不能做左值只能做右值
*cp; //*cp是对ch的内容做前置同时也是对cp进行后置所以不能做左值只能做右值左值强调的是空间/位置 右值强调的是内容/结果
指针数组与数组指针
指针数组 指针数组是一个存放指针的数组例如int arr[20]是一个类型为int*、名为“arr”、存放了20各元素的数组
数组指针 数组指针是一个指针我们知道整形指针“int *point”是一个能够指向整形数据的指针当然数组指针“int (*p)[10]”就是一个能够指向数组的指针
代码解析
int (*p)[10];
//1、p先和*结合说明p是一个指针变量然后指向的是一个大小为10个整数的数组所以平时一个指针指向一个数组叫做数组指针
//要注意的是[]的优先级要高于*所以必须要加上来保证p先和*结合否则p将先和[]结合成为“int* p[10] ”这样就成了一个指针数组数组指针的使用
先分析一下以下代码
int arr[10] {0};
//arr 表示数组首元素的地址
//arr表示数组的地址
//具体差异在哪里
printf(%p\n, arr);//输出的是第一个元素的地址
printf(%p\n, arr1);//输出的是第二个元素的地址
printf(%p\n, arr1);//输出的是整个之后的地址从这里我们可以看出产生的结果是截然不同的虽然数组的地址和首元素的地址值是相同的但是意义不相同。既然出现了数组的地址就需要存储数组地址的容器这时我们会考虑到用数组指针来存放数组的地址由数组指针的定义得知使用数组指针来存放数组的地址是再合适不过了。 现在我们要将一个二维数组传参我们应该怎么做
void test()
{int arr[3][5] {0};print(arr);//这里print函数的参数应该如何设计
}
void print(int arr[3][5])
{}
//这样可以吗当然可以只是最原始的方式
void print(int arr[][5])//ok?
{}
//这样可以吗当然可以因为二维数组的行可以省略列不可以省略
void print(int **arr)//ok?
{}
//这样可以吗?当然不可以因为这是一个二级指针二级指针存放的是一级指针的地址而不是数组的地址
void print(int (*arr)[5])//ok?
{}
//这样可以吗当然可以这是一个典型的数组指针用来存放数组的地址所以可以作为print的参数通过上面的认识来看一下下面的代码
int arr[10];//数组
int *parr1[10];//指针数组
int (*parr2)[10];//数组指针
int (*parr3[10])[10];//存放数组指针的数组
//parr3是名字先和[10]结合说明这是一个拥有10个元素的数组
//对于数组来说去掉名字和[]其他的就是这个数组中存放的元素的类型由(*)[]可知这个数组中存放的是数组指针