前几天去面试,没想到出的面试题都是c语言指针方面的,被虐的体无完肤,无奈大一的时候c语言学的不好,于是回来痛下决心,决定重新认识指针,把自己理解的写下来。
一、内存单元第一个字节的地址为首地址,在C语言中称为指针
指针的基本操作:
(1)&取地址符,取变量在内存单元中的首地址。&操作的对象必须是内存单元,如变量、数组、元素等
(2)*是间接访问运算符,间接访问指针所指向的对象。*运算符的操作对象必须是指针(地址)
int x,*p,p=&x; *p=10;(可以这么理解,*p是一个数值,而P是一个地址)
*p表示通过p间接访问x,*p就是p指向变量即x,因此*p与x是同一个变量。
二、指针和数组
数组值就是这个内存单元的起始地址即指针值,指向数组的第一个元素(即下标0)。因此数组的访问可以用指针访问。
int a[6]={1,2,3,4,5,6},*p;
p=a或&a[0];
*p实际上就是数组元素a[0].
C语言通过数组或指针数组元素有两种变现形式:下标表示和指针表示。那么对于i+1个元素的表示分别可用下标a[i]和指针法*(a+1)
a[0]=10;a[3]=10;
*a=10;*(a+3)=10; //指针法引用第一个和第四个元素分别赋值10
#include#includeint main()
{
int a[6],i,s,*p;
printf("please input data:\n");
for(i=0;i<6;i++)
{
scanf("%d",&a[i]);
}
s=0;
for(p=a;p<a+6;p++)
{
s+=*p;//这里要加上*p,不能加上p;
}
printf("s=%d\n",s);
}
三、指针与字符串
字符串是由若干个字符组成的字符序列,以‘\0’作为串的结束符。
(1)字符串指针:
字符串第一个字符的地址就是字符串指针,字符串指针的类型是字符指针。(字符串指针实际就是一个字符串指针,指向字符串的第一个字符,而不是整个字符串)
(2)用字符串指针指向一个字符串
用字符串指针指向一个字符串,就是使字符串指针指向指针指向字符串的第一个字符。
char *s="hello.Everyone";
或
char *s;
s="hello,everyone"//hello,everyone的地址赋值给s
程序段1:
char *p,*q;
p="hello,world";
q=p+6;
程序段2:
char a[20]="hello,everyone";
char *q;
q=p+11;//q指向字符串one
注意:上面都是把字符串地址(第一个字符的地址)赋值到指针变量中,而不是整个字符串。
(3)字符串的引用
字符串一般存放在字符数组中或用指针指向一个字符串,可以用字符数组名或者指针引用字符串
%s输出的是字符串,%c输出的是字符