文章目录 1.指针的概念(介绍) 2.内存(简介) 3.指针 *** 作 正文 1.指针的概念(介绍)大家好,我是Abert。
指针可谓是C语言的灵魂,这篇文章浅谈指针的概念和用处。
指针是一个值为内存地址的变量(或数据对象)。
(指针就是地址,口头上说的指针大多是指针变量)
指针就是地址,那么假设给定一个指针变量pa,用pa存放a的地址,则可以写为 pa = &a(把 a 的地址赋给 pa ,我们也可以理解为 pa “指向” a,当然,pa还可以指向别处,例如 pa = &b)
若要通过 pa 找到 a ,则可以利用 *pa (找出pa指向的值)即可取出 a 。
&是取地址 *** 作符,获得变量(常量)在内存中的地址。
* 是解引用 *** 作符,将指针变量 pa 解引用,即可找到 a。
注意 pa 是指针变量,pa 的类型是 int * (这里假设a是int类型,如果a是char类型,则pa的类型为char*)
例如:
int main()
{
int a = 0x11223344;
int* pa = &a;
printf("%d\n", a);
printf("%d\n", *pa);
//对比以上结果,结果相同
}
指针变量的大小是4或8个字节(32位环境下是4个字节,64位环境下是8个字节)
二级指针
2.内存(简介)二级指针就是存放一级指针地址的指针,大小也是4(8)个字节。
#include
int main() { int a = 4; int *pa = &a;//一级指针 //接下来定义二级指针 //二级指针的类型取决于一级指针,一级指针是int*类型,二级指针应为int**类型 int** ppa = &pa;//存放指针变量pa的地址 //通过ppa和pa间接找到a的数据 int* ptr = *ppa;//解引用ppa找到pa放到ptr变量中 int b = *ptr;//解引用ptr找到a的数据放到b中,此时a == b printf("%d ", b); }
这个模块简单介绍内存相关内容
计算机内存的单位换算
32位环境下内存大小
不同的指针类型解引用时所能访问的权限也是不同的
下面讲解指针解引用时访问的权限
指针类型还决定了,指针向前或向后走一步,走多大距离
3.指针 *** 作
数组名是数组首元素的地址
但是有2个例外:
sizeof(数组名),数组名表示整个数组,计算的是整个数组的大小
&数组名,数组名表示整个数组,取出的是整个数组的地址
通过指针访问数组
#include
int main()
{
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
//0 1 2 3 4 5 6 7 8 9
int* p = arr;
int sz = sizeof(arr) / sizeof(arr[0]);
int i = 0;
for (i = 0; i < sz; i++)
{
printf("%d ", *(p + i));//通过解引用找到数组中的数据
}
return 0;
}
指针与整数相加(相减)是以字节为单位
递增指针:戴增指向数组元素的指针可以让该指针移动至数组的下一个元素。
(假设有一个指针变量ptr,递增即为 ptr++)
递减指针与递增指针类似
指针与指针之间求差:计算两个指针的差值。
求差的两个指针分别指向同一个空间的不同元素,通过计算求出两元素之间的距离。
|指针 - 指针| 得到的是指针和指针之间的元素个数
下面通过指针减指针实现库函数strlen
strlen可用来求字符串的长度
char [] = " abcdef ";(注意:abcdef后还隐藏了字符\0)
strlen可以求\0之前的元素个数
了解了上面这些,我们来用指针减指针的方式实现我们自己模拟的my_strlen
#include
int my_strlen(char* str)
{
char* tmp = str;//记录初始位置
while (str != '\0')
{
str++;//末尾位置
}
return str - tmp;//两个指针之间元素的个数
}
int main()
{
char arr[] = " abcdef ";//6
int ret = my_strlen(arr);
printf("%d", ret);
return 0;
}
总结
指针的本质是地址,可以是变量的地址,也可以是指针的地址,大小都为4(8)个字节。
以上就是这篇文章关于初阶指针的内容,欢迎大家学习交流。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)