指针的运用补充
指针 +-整数
不使用指针 输出1到10
#include <stdio.h>
int main()
{
int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
int i = 0;
int sz = sizeof(arr) / sizeof(arr[0]);
for (i = 0;i < sz; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
使用指针的情况 (+)
int main()
{
int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
int i = 0;
int sz = sizeof(arr) / sizeof(arr[0]);//10
int* p = &arr[0];
for (i = 0; i < sz; i++)
{
printf("%d ", *(p + i));
}
return 0;
}
(使用 -)倒着输出
int main()
{
int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
int i = 0;
int sz = sizeof(arr) / sizeof(arr[0]);//10
int* p = &arr[sz-1];
for (i = 0; i < sz; i++)
{
printf("%d ", *(p - i));
}
return 0;
}
指针 - 指针
1.指针-指针的前提是:两个指针指向同一块空间
2. 指针-指针得到两个指针之前的元素的个数
应用:
计算字符串的长度
一种
size_t my_strlen(char* p) //自定义函数
{
size_t count = 0; //计数
while (*p != '\0')
{
count++;
p++;
}
return count;
}
int main()
{
char arr[] = "abcdef"; // a b c d e f \0
size_t len = my_strlen(arr); //储存 \0 前面的长度
printf("%zd\n", len);
return 0;
}
第二种
size_t my_strlen(char* p)
{
char* q = p;
while (*q != '\0')
{
q++;
}
return q - p; //在C语言中,q-p具体指代的是指针p和指针q之间所指向的元素的个数
}
int main()
{
char arr[] = "abcdef"; // a b c d e f \0
size_t len = my_strlen(arr); //储存 \0 前面的长度
printf("%zd\n", len);
return 0;
}
运算逻辑:
- 使用
while
循环遍历字符串,条件是当前字符不等于\0
。 - 在循环体内,每次遇到一个字符时,将
len
加1,并将指针str
移动到下一个字符。 - 当循环结束时,
len
的值即为字符串的长度。
具体分析:
例如,如果p
和q
都是指向int
类型的指针,并且int
在当前系统上占用4个字节,那么q-p
的结果就是两个指针之间相差的字节数除以int
类型的大小(即4字节),得到的就是两个指针之间所指向的int
元素的个数。
具体来说,如果p
指向数组a
的第0个元素,而q
指向数组a
的第3个元素,那么q-p
的结果就是3,表示q
指向的元素在p
指向的元素之后的第3个位置。反之,如果p
指向数组a
的第3个元素,而q
指向数组a
的第0个元素,那么p-q
的结果就是-3,表示p
指向的元素在q
指向的元素之后的第3个位置。
注意事项:
需要注意的是,只有当两个指针指向同一个数组时,它们之间的减法操作才是合法的,并且结果是有意义的。如果两个指针指向不同的数组或不同的内存区域,那么它们之间的减法操作是未定义的行为,可能会导致不可预测的结果。