指针与函数的关系、栈、字符串处理

   指针与数据关系:

1、指针与变量
 2、指针与数组(一维,二维)
 3、指针与结构体的变量
 4、二级和多级指针
     一级指针变量:专门用于存放普通变量的地址
            eg:  int b=200; int* a=&b;
     二级指针变量:专门用于存一级指针变量的地址
        二级定义变量:  类型**  变量名

5、指针与函数的关系:
    C语言:面向过程(模块(函数):功能)
    函数分类:自定义函数,系统函数
        系统函数:由系统提供的模块接口(API)
                printf(实参)  ...
     1、调用函数:  函数名(实参列表);
        注:调用函数一定要函数名匹配
     2、自定义函数:f(x,y)=3x+y;
        函数类型  函数名(形参列表)
        {
            函数体;//功能模块的过程描述 
        }
         1、无返回值  无形参
            viod 函数名(void)
            {
            }
         2、有形参  无返回值
            void  函数名(形参列表)
            {
            }
            1、一级指针作形参:当在被调用函数内需要修改调用函数内的数据时传递地址
            2、传递数组:
               返回值  函数名(char buf[]);//buf是指针变量
            3、结构体作形参:(实参传递形参:值传递)
                  缺点:不能修改调用函数内的结构体内容
                    (通过名字或者地址)
               结构体指针作形参:修改指向内容

3、变量的作用域,生命周期:
        1、变量作用域:能被引用的区间
            全局:在函数外定义的变量
                作用域:从定义开始,到本文件程序。
            局部:在函数内定义的变量
                作用域:在函数内
        2、变量的生命周期:
          动态区:auto变量(只能在函数内定义)
             当函数被调用时,空间被申请。当函数运算结束时,空间被释放。
          静态区:static变量或全局变量
          堆  区:alloc/malooc等申请  free释放

 栈:是一种算法思想(先进后出 FILO  => first,into,last,out )
 应用:撤消,浏览上一页,恢复
 算法:#口
           栈顶:能被操作的一端(能进栈/出栈)
           栈底:不能被操作的一端(不能进栈/出栈)
           操作:每次操作“只能”取/进一个数据
  顺序(数组:)栈:数据的容器是一个块数组
  功能:
  1、初始化栈:initStack
  2、进栈:  push
         注:栈不能为满
  3、出栈: pop
  4、栈元素的个数:stackLength
  5、次栈栈顶元素的:
  6、清空栈:ClearStack
  7、判断栈为空:IsEmpty
  8、判断栈为满 :IsFull

       通过二级指针修改一级指针 : 

#include<stdio.h>
void main()
{
//定义变量:按类型来分配空间
	int b=200;	
//引用变量:引用变量的内容
	printf("b=%d\n",b);
//修改一个变量的内容:变量名 空间地址
	b=100;
	printf("b=%d\n",b);
//定义一个指针变量:存放普通变量的地址  (int*  )		
	int* a=&b;
//通过一级指针修改b的内容(通过a间接修改b的内容)
	//a=199; 不能成功的修改b的内容   只会修改a的内容
	*a=199;
	printf("b=%d\n",b);

//二级指针:存放一级指针变量的地址
	printf("%x\n",&a);
	//int*c =&a; //警告:一级指针只能存储普通的地址
	int* c=a;
	printf("%x %x %x\n",&b,a,c);

	int** ppa=&a;	
	printf("sizeof(ppa)=%d\n",sizeof(ppa));	
	
	printf("%x\n",ppa);//a的地址

//应用:1通过ppa修改b的值 (需要b的地址)
	printf("*ppa=%x  **ppa=%d\n",*ppa,**ppa);//ppa引用ppa的内容(a的空间的地址) *ppa==(*&a)引用a的内容
	  
	**ppa=1999;
	printf("b=%d\n",b);	

//	*2通过二级指针修改一级指针的内容:通过ppa修改a(a->b)的内容(a->y)
	int y=2018;
//	ppa=&y;  //error:只会修改ppa的内容
	*ppa=&y;

	printf("*a==%d\n",*a);
//定义变量:按类型分配空间
//引用变量:引用b的内容或者地址的内容  *地址  b
//  地址->成员   内容.成员
}

         二级指针与结构体的关系 :

  修改结构体的内容 , 通过  strcpy(( **pp ).name , " lili" ); 来修改.

#include<stdio.h>
#include<string.h>
//结构体:
struct people
{
	int id;
	char name[10];
};

void main()
{
//定义变量:按类型分配空间
	struct people lf={1001,"lifei"};	
//引用变量的属性: 内容.属性
	printf("%s\n",lf.name);
//一级指针变量:类型* 变量名;
	struct people* p=&lf;
	printf("%x\n",p);//引用变量:引用变量的内容  p的内容为lf的地址
	printf("%s\n",p->name);
//二级指针:
	struct people** pp=&p;
	printf("%s %s\n",   (*pp)->name, (**pp).name);
//通过pp修改自己的名字:
	strcpy((**pp).name,"lili");
	printf("%s\n",lf.name);
}

通过指针交换局部变量的a , b 的值 ,  还有通过指针改变改变数组的字符.

#include<stdio.h>
//交换函数:
void swap(int* x,int* y)
{
	int temp=*x;
	*x=*y;
	*y=temp;	
	printf("main: x=%d,y=%d\n",*x,*y);
}
//数组作形参:它是一个指针变量
void fun(/*char* pb*/char pb[])
{
	*(pb+0)='H';//引用内容	
}

void main()
{
	char buf[100]="hello world";
//调用函数:
	printf("main::sizeof(buf)=%d\n",sizeof(buf));
	fun(buf);//实参 buf名字:首地址
	printf("%s\n",buf);
/*
	int a=1,b=2;
	swap(&a,&b);
	printf("main: a=%d,b=%d\n",a,b);
*/
}

习题 : 

        通过指针 , 转换字符串成为整型  atoi 

#include<stdio.h>
//将某数组转换为整形
int change(char pb[]/*char* pb*/)
{
	//1-49 2-48
	int result=0;
	while(*pb>='0' && *pb<='9')
	{
		result*=10;
		result+=(*pb-'0');	//ASCII ‘0’---48
		pb++;//指向下一个元素
	}
	return result;
}

void main()
{
	char buf[100]="123";	// 123a4--->123    a123->0   12a3->12
	printf("%d %d\n",change(buf),atoi(buf));
}

习题 : 

       (两种方法)通过指针实现 , 比较两个字符串大小:strcmp(s1,s2);

#include<stdio.h>
/*
 * 功能:比较两个字符串大小
 * 返回值: 1> 0 == -1 <
 * 函数名: strcmp_if(char str1[],char str2[])
 */
short strcmp_if(char str1[],char str2[])
{

	int result=0,i=0;
	while(0==(result=*(str1+i)-*(str2+i)) && *(str1+i)!='\0')	//str1!='\0'&&*str2!='\0'
	{
		i++;
	};
	if(result>0)
	{
		printf("1>2");
	}
	else if(result<0)
	{
		printf("1<2");
	}
	else
	{
		printf("相等");
	}
/*	short result=0;
	while(0==(result=*str1-*str2)&&*str1!='\0')
	{
		str1++;
		str2++;
	}
	return result;*/
}

void main()
{
	char buf1[10]="21333";
	char buf2[10]="1234";
	strcmp_if(buf1,buf2);
/*	int a=100;
	int result=strcmp_if(buf1,buf2);
	if(result>0)
	{
	}
	else if(result==0)
	else
*/
}

习题 :

        通过指针来实现 , 复制字符串:

#include<stdio.h>

void strcpy_lf(char str1[],char str2[])
{
/*
	int i=0;
	while('\0'!=(*(str1+i)=*(str2+i)))i++;
	printf("%s",str1);
*/

/*第三种
 * 	int i=0;
 * 	while((*str1=*str2)!='\0')
 * 	{
 * 		str1++;
 * 		str2++;
 * 	}
 */
	int i=0;
	while(*(str1+i)!='\0');
	for(i=0;*(str2+i)!='\0';i++)
	{
		*(str1+i)=*(str2+i);
	}
		printf("%s",str1);
}

void main()
{
	char buf1[10]="21333";
	char buf2[10]="1234";

	strcpy_lf(buf1,buf2);
}

       栈 :

#include<stdio.h>

struct stack
{
	int buf[6];
	int top;
};

void initStack(struct stack* ps);

void initStack(struct stack* ps)
{
	if(NULL!=ps)
	{
		ps->top=-1;
	}
}

short full(struct stack* p)
{
	if(p->top==6-1)
		return 0;
	else
		return 1;
}

short empty(struct stack* p)
{
	if(p->top==-1)
		return 0;
	else
		return 1;
}

short push(struct stack* p,int data)
{
	if(0==full(p))
		return 0;
	else
		p->buf[++p->top]=data;
		return 1;
}

short pop(struct stack* p,int* pdata)
{
	if(0==empty(p))
		return 0;
	else
		*pdata=p->buf[p->top--];
		return 1;
}

short geshu(struct stack* p)
{
	return p->top;
}

short qk(struct stack* p)
{
	p->top=-1;
}


void main()
{
	struct stack c;
	initStack(&c);
	int opt;
	//int a=0;
	while(1)
	{
		printf("出栈0,进栈1,长度2,清空3:");	
		scanf("%d",&opt);
		if(opt==1)
		{
			int data;
			printf("请输入进栈数:");
			scanf("%d",&data);
			if(1==push(&c,data))
			{
				printf("进栈seucces\n");
				//a++;
			}
			else
				printf("进栈defeat\n");
		}
		else if(opt==0)
		{
			int pdata;
			printf("请输入出栈数:");
			scanf("%d",&pdata);
			if(0==pop(&c,&pdata))
				printf("出栈defeat\n");
			else
			{
				printf("出栈seucces\n");
				//a--;
			}
		}
		else if(opt==2)
		{
			printf("元素的个数有:%d\n",geshu(&c)+1);
		}
		else if(opt==3)
		{
			qk(&c);
			printf("以清空元素");
		}
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值