C语言指针2

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]);

}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容