本文主要是介绍ANSI C (6) —— 指针、断言、信号、跳转,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
指针
指针的声明
下面的三条语句是等价的,但是我们常常使用的是第一种形式int *p,同时我们注意,他们是在初始化p而不是*p。
#include <stdio.h>
#include <stdlib.h>int main()
{int a=12;int *p1=&a; int* p2=&a;int * p3=&a;printf("p1: %p %d\n",p1,*p1);printf("p2: %p %d\n",p2,*p2);printf("p3: %p %d\n",p3,*p3);return 0;
}
/*
p1: 0028FF10 12
p2: 0028FF10 12
p3: 0028FF10 12
*/
指向void 类型的指针可以指向其他的任何的数据类型变量的地址。任何类型的指针也可以指向void.
int main()
{int a=12;double b=12.99;void *p=&a;printf("%d\n",*((int *)p));p=&b;printf("%lf\n",*((double *)p));return 0;
}
/*
12
12.990000
*/
我们可以在变量value前使用&但是不能在value ‘计算符’ ‘常量或变量’前加&,因为value ‘计算符’ ‘常量或变量’得到的是常量
int a=12,b=10;int *p=&(a+b); // error: lvalue required as unary '&' operand
数组和指针
数组名是一个指针常量,数组定义时设置成数组第一个单元的地址,从此以后就不能修改,int a[3]; a=...
是错误的。
但是修改数组的单元是合法的,a[1]=...
。
指针变量可以进行赋值操作。
#include <stdio.h>
int main(){ char *p=NULL; char s[10]="123456789"; p=s; printf("%s\n",p); p=s+2; /* 等价于 p=&s[2]; [2]表示和数组首地址的偏移量是2 */ printf("%s\n",p); p=s+4; /* 等价于p=&s[4]; [4]表示和数组首地址的偏移量是4 */ printf("%s\n",p); return 0;
}
/*123456789345678956789*/
这篇关于ANSI C (6) —— 指针、断言、信号、跳转的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!