我们今天将从上一篇的基础上继续来学习指针(序号也是连续的)
int main()
{
int m = 0;
m = 20;//m是可以修改的
const int n = 0;
n = 20;//n是不能被修改的
return 0;
}
(1)无const修饰情况
int main()
{
int a = 10;
int n = 6;
int* pa = &a;
*pa = 20;//ok
pa = &n;//ok
return 0;
}
(2)const加在*左侧
int main()
{
int a = 10;
int n = 6;
const int* pa = &a;
*pa = 20;//err
pa = &n;//ok
return 0;
}
(3)const加在*右侧
int main()
{
int a = 10;
int n = 6;
int* const pa = &a;
*pa = 20;//ok
pa = &n;//err
return 0;
}
(4)const 加在*左右两侧
int main()
{
int a = 10;
int n = 6;
const int* const pa = &a;
*pa = 20;//err
pa = &n;//err
return 0;
}
int main()
{
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
int* p = &arr[0];
int i = 0;
int sz = sizeof(arr) / sizeof(arr[0]);
for (i = 0; i < sz; i++)
{
printf("%d ", *(p + i));//p+i 这⾥就是指针+整数
}
return 0;
}
p是一个整型指针,所以加1就跳过一个整型,加2跳过两个整型,以此类推,就能找到数组的所有元素
int my_strlen(char* s)
{
char* p = s;
while (*p != '\0')
p++;
return p - s;
}
int main()
{
printf("%d\n", my_strlen("abc"));
return 0;
}
指针-指针计算的是指针与指针之间的元素个数,但这两个指针必须指向同一块内存空间,上述代码,传参传的是首元素地址。也就是a的地址,s接收a的地址,又定义了p变量也指向这块内存空间,让p指针找'\0',找到'\0'处p指针停下来,返回p-s,也就是三个字符,最后的结果就是3,
注:如果返回的是s-p,那结果就是-3
int main()
{
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
int* p = &arr[0];
int sz = sizeof(arr) / sizeof(arr[0]);
while (p < arr + sz) //指针的⼤⼩⽐较
{
printf("%d ", *p);
p++;
}
return 0;
}
这里用到了数组的一个特性,随着下标的增长,地址是由低到高变化的,而arr+sz跳到了数组后面,所以用p可以找到每一个元素
int main()
{
int* p;//局部变量指针未初始化,默认为随机值
*p = 20;
return 0;
}
int main()
{
int arr[10] = { 0 };
int* p = &arr[0];
int i = 0;
for (i = 0; i <= 11; i++)
{
//当指针指向的范围超出数组arr的范围时,p就是野指针
*(p++) = i;
}
return 0;
}
int* test()
{
int n = 100;
return &n;
}
int main()
{
int* p = test();
printf("%d\n", *p);
return 0;
}
int main()
{
int num = 0;
int* p1 = #
int* p2 = NULL;
return 0;
}
int main()
{
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
int* p = &arr[0];
int i = 0;
for (i = 0; i < 10; i++)
{
*(p++) = i;
}
//此时p已经越界了,可以把p置为NULL
p = NULL;
//下次使⽤的时候,判断p不为NULL的时候再使⽤
//...
p = &arr[0];//重新让p获得地址
if (p != NULL) //判断
{
//...
}
return 0;
}
assert(p != NULL);
#define NDEBUG
#include