赞
踩
例如:若是按照下标的方式进行打印出数组:
int arr[10]={1,2,3,4,5,6,7,8,9,0};
int sz = sizeof(arr)/sizeof(arr[0]);
for(int i=0;i<sz;i++)
{
printf("%d ",arr[i]);
}
也可以按照指针的方式进行打印:
int *p=&arr[0];
for(int i=0;i<sz;i++)
{
printf("%d ",*p);
p++;
}
还可以:
int *p=&arr[0];
while(p<&arr[sz])
{
printf("%d ",*p);
p++;
}
//因为是整形,所以*p解引用得到4个字节,
1:指针的类型决定指针+1的步长,决定指针解引用的权限
2:指针在内存中是连续的
也可以改为减的:
int *p=&arr[sz-1];
for(int i=0;i<sz;i++)
{
printf("%d ",*p);
p--;
}
指针-指针的绝对值(因为有正负之分)是指针和指针之间的元素的个数
计算前提条件:两指针指向的是“同一空间”
例如:int arr[10]={0,1,2,3,4,5,6,7,8,9};
printf("%d ",&arr[9]-&arr[0]); //回车得到的是9。
//元素之间相差为9,所以最后打印出的值为9.
求字符串长度:strlen是求\0之前的字符串长度
int main()
{
char arr[]="abcdef";
size_t len=my_strlen(arr);//调用函数进行求解字符串的长度
printf("%zd\n",len);
return 0;
}
普通求法:size_t my_strlen(char *p){ //size_t是一种无符号整形
int count =0;
while(*p!='\0')
{ //知道p一直数到\0.
count++;
}
return count;}
指针-指针的方式:
size_t my_strlen(char *p){
char *start=p;
char *end=p;
while(*end!='\0')
{
end ++;
} //令其数到最后
return end-start;}
指针指向的位置是不可知的(随机的,不正确的)
例如:int main(){
int *p; //一个局部变量不初始化,它就是随机的
*p=20; //就是野指针
return 0;}
以上的p是局部变量,但是未初始化,其值是随机的,若是将p存放的值当作地址,解引用操作符会形成非法访问。
如果明确知道指针指向哪里就直接赋值,如果不知道指针指向哪里,可以赋值NULL
例如:
int a=10;
int *p=&a;
int *p2=NULL;//不可进行解引用操作
*p2=200; //错误写法,引发异常。
assert.h头文件中定义了宏assert()用于运行时确保了程序符合指定条件,若是不符合就报错终止运行,这个宏常被称为“断言”。
例如:#include<assert.h>
int main()
{
int *p=NULL;
assert(p!=NULL); //因为为假,所以会报错
}
所以assert接受表达式为真的话assert()不会产生任何作用,程序继续运行
若是表达式为假,assert()就会报错。
assert不仅可以自动识别文件和出现的问题行号,还有一种无需更改代码就能开启和关闭的assert机制
在Debug中使用,在release中可选择禁用assert。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。