以下是顶嵌嵌入式培训 学员延小伟所写的C语言技术文章:
说白了,指针就是地址,地址里面放着不同的值,用操作指针的方法来操作这些值。
在32位机中,指针本身占4位, 定义时,可以 int *p=&a,其中int *是一部分,用来定义后面的指针 p , 使用时,p=&a,表示对指针p的操作。不能再用*p=&a, 指针变量是个变量,这个变量存放的内容是地址。
//指针变量的定义和引用
#include
int main( )
{
int a1=11,a2=22;
int *p1,*p2,*p;
p1=&a1;
p2=&a2;
printf("%d,%d\n",*p1,*p2);
p=p1; p1=p2; p2=p;
printf("%d,%d\n",*p1,*p2);
return 0;
}
输出:
11,22
22,11
指针与一维数组
Int *s;int a[5];
S=a;//将指针指向数组,两边都是地址,合理。
访问:a=&a[0]=s=&s[0]=a[0]=*a=s[0]=*s;
/通过指针在函数间传递一维数组
/*编写在数组的最后一个元素中存放其它元素和的函数*/
#include
void summary(int *p, int n);
int main()
{
static int a[11]={1,2,3,4,5,6,7,8,9,10};
summary(a,10);
printf("Sum is %d\n",a[10]);
return 0;
}
void summary(int *p, int n)
{
int s=0;
while (n--)
s+=*(p++);
*p=s;// 累加所指的内容
}
结果:
Sum is 55
指针与字符串
字符串的特殊之处是其末尾是结束标志‘\0’
/通过指针访问字符串
//将字符数组a中的字符串拷贝到字符数组b中
#include
int main()
{
char a[]="Hello,world!",b[20],*pa,*pb;
int i;
for(i=0;a!='\0';i++)
b=a;
b='\0';
printf("%s\n",b); // 下标法
for(pa=a,pb=b;*pa!='\0';pa++,pb++)
*pb=*pa;
*pb='\0';
printf("%s\n",b); // 指针法
return 0;
}
输出:
Hello,world!
Hello,world!
Sizeof()和strlen()的区别:
尽管两者都是统计字符串的个数,但是Sizeof()统计的是已定义的长度,不管里面放多少东西,strlen()统计的是实际占用长度。
#include
int main()
{
char str[20]="0123456789";
char *p;
int a=strlen(str);
int b=sizeof(str);
int c=sizeof(p);
printf("a=%d,b=%d,c=%d\n",a,b,c);
return 0;
}
结果:
a=10,b=20,c=4
int *p[3]和int (*p)[3]的区别
int *p[3]是返回一个整型数据的指针所组成的数组,数组内的内容是指针
int (*p)[3]指向由整型数据组成的数组的指针
总结:
指针就是地址,通过操作地址来操作需要的值,指向指针的指针就是指向地址的地址。数组的数组名就是数组的首元素的地址,可以看作指针来使用。