char * string =“I LOVE china”;
在C 语言中 只有字符变量,没有字符串变量。
char *string; // 定义一个 char * 型变量。(字符指针变量);
string =“i love china”;
注:string 被定义为一个指针变量,基类型为字符型。只能指向一个字符型数据,而不能指向多个字符数据,只接受首地址。
//=====================
# include
int main( )
{
char a[ ] =“I am a man”,b[20];
int i;
for(i = 0;*(a+i) !=‘\0’;i++)
{
*(b + i) = *(a + i);
}
*(b + i) =‘\0’;
printf(“string a is :%s\n”,a);
printf(“string b is:”);
for(i = 0;b[i] !=‘\0’;i ++)
printf(“%c”,b[i]);
printf(“\n”);
return 0;
}
// ===== 指针处理===
char a []=“I am a man”,b[20],*p1,*p2;
p1 = a;p2 = b;
for(;p1 !=‘\0’;p1++,p2++)
*p2 = *p1;//将p1所指向的元素的值赋给p2 所指向的元素;
*p2 =‘\0’;
printf(“string a is :%s\n”,a);
printf(“string b is :%s\n”,b);
//============
2.字符指针 作为 函数参数
如果想把字符串 从一个 函数 传递到 另一个函数 ,可以用地址传递的方法,即用字符数组名作参数,也可用字符指针变量 作 参数。在被调用的函数中 可以 改变 字符串 的内容 ,在主调函数中可以引用改变后 字符串。
、用函数实现字符串的复制
void copy_string(char from[],char to[])
{
int i;
while(from[i] !=‘\0')
{
to[i] = from[i];i++;
}
to[i] =‘\0’;
}
void copy_string(char *from,char *to)
{
for(;*from !=‘\0’,from++,to++)
{
*to = *from;
}
*to =‘\0’;
}
//======
、指针变量的值可以改变,而数组名代表一个固定的值(数组元素的地址),不能改变。
、字符数组中各元素的值可以改变,但是字符指针变量指向的字符串常量中内容是不能被取代的。
char a[] =“house”;
char *b =“house”;
a[2] =‘r’;b[2] =‘r’;(非法的)
、引用数组元素。对字符数组可以用下标法一个数组元素,如a[5]; 也可以用地址法 *(a + 5);如果定义了字符指针变量 p,并使它指向字符数组首元素。就可以用指针变量带下标的形式引用字符数组元素(P[5]),同样,可以使用地址符号 *( p + 5);
、用指针变量指向一个格式字符串,可以用它代替格式字符。
char *format;
format =“a = %d,b=%f\n"
但是使用 字符数组时,只能采用 在定义数组时初始化,或者逐个对元素赋值,而不能对数组名 整体赋值。
2、指向函数的指针
在程序中定义了一个函数,在编译时,编译系统会自动为代码分配一段存储空间,这段存储空间的起始地址(又称入口地址),称为正饿函数的指针。
如何定义: 类型名 (*指针变量名)(函数参数表列)
类型名:函数返回值类的型
函数参数列表:形参的类型
int max(int ,int );
int min(int ,int);
int(*p)(int x,in y);
int a,b,c,n;
printf(“enter a and b:")
scanf(“%d,%d”,&a,&b);
printf(“choose 1 or 2:")
scanf(“%d”,&n);
if(n == 1) p = max;
else if (n ==2) p = min;
c = (*p)(a,b);
printf(“a = %d,b= %d”,a,b);
if ( n == 1) printf(“max = %d”,c);
else printf(“min = %d”,c);
return 0;
int max(int x,int y);
int min(int x,int y);
一个指向函数的指针变量 可以指向不同函数
3.用指向函数的指针 作为函数参数
指向函数的指针变量 的 一个 重要用途 是 把 函数的地址 作为参数传递 到其他 函数
int add(int x,int y)
{
int z;
z = x + y;
return z;
}
int min (int x,int y)
{
int z ;
z = (x > y) ? y:x;
return z;
}
int max(int x,int y)
{
int z;
z = (x > y) ? x : y;
return z;
}
int fun(int x,int y,int (*p) (int ,int)) // 声明形参 是 指向 函数的指针
{
int result;
result = (*p)(x,y);
printf(“%d\n”,result);
}
int main( )
{
int a =34,b = -21,n;
printf(“choose the number 1,2 or 3:”);
scanf(“%d”,&n);
if (n == 1) fun(a,b,max); // max 作为实参 将其入口地址 传送给 fun中的形参 P;
if (n == 2) fun(a,b,min);
if(n == 3) fun(a,b,add);
return 0;
}
//===========================================
3、返回指针值的函数
一个函数 可以返回 一个整型值、字符值、实型值等 ~,也可返回指针型的数据。
int * a(int x,iint y); a 是函数名,调用它以后能得到 一个 int * 型(指向整形数据)的指针,即整型数据的地址。()优先级 高于 *; a 先与()结合,显然是函数形式。函数前面有* 。表示此函数是函数型指针(函数值时地址),最前面的int 表示 返回的 指针 指向整型变量。
类型名 * 函数名(参数表列);
有 a 个学生,每个学生有 b 们成绩。要求在学生输入学生 序号以后,能输出 该生的全部成绩。
// 数组 存放 成绩;查询学生成绩的函数 ,它是一个返回 指针 的函数,形参是指向 一维数组的 指针变量和整形变量。从主函数 将 数组名 和 score 和要找的 学生号 k 传递给形参,返回值 是& score[K][0];
# include
int main( )
{
float score[][4] = {{60,70,80,90},{56,89,67,88},{34,78,90,66}};
float *search (float (*pointer)[4],int n);
float *p;
int i ,k;
printf(“enter the number of student:”);
scanf(“%d”,&k);
printf(“the score of No.%d are :\n”,k);
p = search(score ,k);
for(i = 0,i < 4.i++) printf(“%5.2f\t”,*(p +i));
printf(“\n”);
return 0;
}
float *search(float(* pointerp[4],int n))
{
float *pt;
pt = *(pointer +n);
return pt;
}
//==============
int main()
{
float score[][4] = {{60,70,80,90},{56,89,67,88},{34,78,90,66}};
float *search (float (*pointer)[4],int n);
int *p;
int i,j;
for(i = 0;i < 3;i++)
{
p = search(score + i);
if (p == *(score + i))
{
printf(“No.%d score:”,i)
for (j = 0;j < 4;j++)
printf(“%5.2f “,*(p+j))
}
}
return 0;
}
float *search (float (*pointer)[4],int n);
{
int i = 0;
float *pt;
pt = NULL;
for(;i < 4;i++)
if (*(* pointer +i) < 60) pt = pointer;
return pt;
}
//===============================
指针数组 和多重指针
类型名 * 数组名[]
# include
# include
int main( )
{
void sort(char *name[ ],int n);
void print(char *name[ ],int n);
char * name[ ] = {“Follow me”,”BASIC”,”Great Wall”,”FORTRAN”,”Competer design”};
// 定义指针数组 ,它的元素 分别 指向5个字符串
int n = 5;
sort(name,n);
print(name,n);
return 0;
}
void sort(char * name[ ],int n)
{
char *temp;
int i,j,k;
for(i = 0;i < n-1;i++)
{
k =i;
for(j = i +1;j < n;j++) if (strcmp(name[k],name[j]) > 0) k = j;
if(k != i )
{
temp = name[i];name[i] = name[k]; name[k] = temp;
}
}
}
void print(char *name[ ],int n)
{
int i;
for(i = 0;i < n;i++) printf(“%s”,name[i]);
}