目录:
8.const 修饰指针
*修饰普通变量
*修饰指针变量
9.指针运算
*指针+或-整数
*指针-指针
*指针关系运算
往期推荐
8.const 修饰指针
const 全称 constant adj.不变的
*修饰普通变量
cpp
#include <stdio.h>
int main()
{
const int num = 0;
num = 20;
printf("%d\n", num);
return 0;
}
这样写会报错
说明const修饰的值不可改变
注:在C语言中,这里的num是常变量,num的本质还是变量,因为有const修饰,编译器在语法上不允许修改这个变量;而在C++语言中,这里的num就是常量
如果要强行改变,用指针
cpp
#include <stdio.h>
int main()
{
const int num = 0;
int* pi = #
*pi = 2;
printf("%d\n", num);
return 0;
}
但显然已经违反常变量的语法规则,需要限制指针的行动-->const修饰指针变量
*修饰指针变量
三种写法
1.const 放在*的左边
如const int* pi = # int const * pi = #
语法规则:指针指向的内容不能通过指针来改变,但是指针变量本身的值是可以改
*pi=?; 错误 pi=&n;正确
2.const 放在*右边
如int* const pi = #
语法规则: 指针指向的内容能通过指针来改变,但是指针变量本身的值是不可改
*pi=?; 正确 pi=&n;错误
3.const 放在*的左右两边
如const int* const pi = #
语法规则:由1,2推, 指针指向的内容不能能通过指针来改变,且是指针变量本身的值是不可改
9.指针运算
*指针+或-整数
在37.【C语言】指针(重难点)(B)中已提到一些内容
练习:因为数组在内存中连续存放,所以可以用指针打印数组
cpp
#include <stdio.h>
int main()
{
int arr[10] = { 0,1,2,3,4,5,6,7,8,9 };
int* pi = &arr[0];
int length=sizeof(arr)/sizeof(arr[0]);
for (int i=0;i<length;i++)
{
printf("%d ", *(pi+i));//注意pi不变
}
return 0;
}
*指针-指针(即地址-地址)
大地址-小地址 和 小地址-大地址 ,注意有正负
cpp
#include <stdio.h>
int main()
{
int arr[10] = { 0,1,2,3,4,5,6,7,8,9 };
printf("%d",&arr[8] - &arr);
return 0;
}
总结:当两个指针指向同一个空间时,(指针-指针)的绝对值==指针之间的元素个数
进一步思考:
求字符串长度:
1.strlen函数
strlen(数组); 统计\0之前的元素个数
cpp#include <stdio.h> int main() { char arr[] = { "asdfghjk" }; size_t result=strlen(arr); printf("%d", result); return 0; }
具体见20.5.【C语言】求长度(sizeof和strlen)的两种方式
2.用指针
未遇到\0则指针++
cpp#include <stdio.h> int main() { char arr[] = { "asdfghjk" }; char* pi = &arr;//&数组名就是&数组名[0] int result = 0; //可以简写成while (*pi) \0的ASCI值是0 while (*pi != '\0')//未到\0则继续循环 { result++; pi++;//指针移动 } printf("%d", result); return 0; }
也可以改成指针-指针
cppprintf("%d", pi-&arr);
*指针(大小)关系运算
可以用来打印数组
cpp
#include <stdio.h>
int main()
{
int arr[] = { 0,1,2,3,4,5,6,7,8,9 };
int* pi = &arr;
int sz = sizeof(arr) / sizeof(arr[0]);
while (pi < &arr[sz])//&arr[sz]越界不会产生影响
{
printf("%d ", *pi);
pi++;
}
return 0;
}
往期推荐: