指针数组函数(new)

指针函数数组字符串(new)

一、指针数组

指针数组:为数组,每个元素都是指针

数组指针:为指针,指向数组的指针

(1)指针数组

#include 

int main(int argc,char argv[])
{
 	int a[3]={0,1,2};
    //指针数组
    int *p[3];
    p[0]=&a[0];
    p[0]=a;
    
    p[1]=&a[1];
    p[1]=a+1;
    
    p[2]=&a[2];
    p[2]=a+2;
    
    int n=sizeof(p)/sizeof(p[0]);
    int i=0;
    for(i=0;i<n;i++)
    {
        p[i]=&a[i];//a+i
    }
    for(i=0;i<n;i++)
    {
        printf("%d\n",*p[i]);
    }
    
    return 0;
}

二、指针和函数

(1)函数形参改变实参的值

#include 

void swap(int m,int n);
{
    int tmp;
    tmp=m;
    m=n;
    n=tmp;
    printf("m=%d,n=%d\n",m,n);
}

int main(int argc,char *argv[])
{
    int a=11;
    int b=22;
    
    swap(a,b);//swap()函数调研完毕,m,n,tmp自动释放。值传递,形参的修改不会影响到实参
    printf("a=%d,b=%d\n",a,b);
}
//没有实现交换a,b
#include 

void swap(int *m,int *n)
{
	int tmp;
    tmp=*m;
    *m=*n;
    *n=tmp;
}

int main(int argc,char *argv[])
{
    int a=11;
    int b=22;
    
    //swap(a,b);值传递,不管这个变量是什么类型,只有是变量本身传递,就是值传递
    
    swap2(&a,&b);//地址传递,变量的地址
    printf("a=%d,b=%d\n",a,b);
}

(2)数组名做函数参数

#include 

//形参中的数组不是数组,是普通指针变量
//形参数组:int a[10000],int a[],int *a对编译器而已没有任何区别,都是当作int *处理
//形参中的数组和非形参数组区别:形参中数组是指针变量,非形参数组就是数组
//void printf_array(int a[])
void printf_array(int *a)
{
    int i=0;
    int n=sizeof(a)/sizeof(a[0]);
    for(i=0;i<n;i++)
    {
        printf("%d,",a[i]);
    }
    printf("\n");
    
    a=NULL;//形参中的数组,不是数组,是普通指针变量
}

void printf_array2(int *a,int n)
{
    int i=0;
   
    for(i=0;i<n;i++)
    {
        printf("%d,",a[i]);
    }
    printf("\n");
}

int main()
{
    int a[]={1,-2,3,-4,5,-6,7,-8,9};
   // printf_array(a);//传递的是数组的首元素地址,&a[0]
    
    int n=sizeof(a)/sizeof(a[0]);
    printf_array2(a,n);//应该把数组元素个数传递过去
}

(3)返回局部变量的地址

//int *fun()//返回值是指针类型

#include 

int *fun()
{
    int a;
    
    return &a;
}

int main(int argc,char *argv[])
{
    int *p=NULL;
    
    p=fun();//接收函数返回的地址
    *p=100;//操作指针所指向的内存
    
    return 0;
}

(4)返回全局变量的地址

//放在{}外面定义的变量就是全局变量,全局变量在任何地方都能使用
//全局变量只有在整个程序结束后才释放
#include 

int a;

int *fun()
{
    return &a;//fun()调用完毕,a不释放
}

int main(int argc,char *argv[])
{
    int *p=NULL;
    p=fun();
    
    *p=100;
    printf("*p=%d\n",*p);
}

二、字符串

(1)字符串的打印说明

#include 

int main(int argc,char *argv[])
{
    char str[]="hello mike";
    //printf("str=%s\n",str);
    //%s是从首元素开始打印,直到结束符位置
    //%s操作的是指针所指向的内容
    
    //str是首元素的地址,如果想要打印str本身的值,可以用%p,%x,%d,%o
    
    printf("str=%p\n",str);
    
    //*str代表第0个元素,是char类型
    //printf("str3=%s\n",*str);//err
    printf("str3=%c\n",*str);
    
    int i=0;
    while(str[i]!='\0')
    {
        printf("%c",str[i]);
        i++;
    }
    printf("\n");
}

(3)字符指针

#include 

int main(int argc,char *argv[])
{
    char str[]="hello";
    
    str[0]='1';
    *(str+1)='2';
    printf("str=%s\n",str);//12llo
    
    //定义一个指针,指向首元素
    char *p=NULL;
    p=&str[0];
    //或p=str;//数组名就是首元素地址
    
    *p='a';
    p++;
    *p='b';
    printf("str=%s\n",str);//abll0
    printf("p=%s\n",p);/bllo
}

(4)字符串拷贝

#include 
#include 

int main01(int argc,char *argv[])
{
    char *p;
    //不是给p变量拷贝内容
    //给p所指向的内存拷贝内容
    //p是野指针,给野指针所指向的内存拷贝内容,结果导致段错误
    strcpy(p,"hello mike abc");
}

int main()
{
    char buf[100];
    char *p=buf;
    //p指向buf的首元素
    //strcpy()是给p所指向的内存拷贝内容,字符串拷贝给了buf
    strcpy(p,"hello mike abc");
    
    printf("p=%s,buf=%s\n",p,buf);
    
    return 0;
}

(5)const修饰的字符指针

#inlude 

int main(int argc,char *argv[])
{
    char buf[]="hello";
    char *p1=buf;
    *p1='a';//改变指针所指向的内存
    p1=NULL;//改变指针变量本身
    
    //const修饰*,指针所指向的内存不能修改
    const char *p2=buf;
    *p2='a';//err
    p2=NULL;//ok
    
    
}

(6)字符串常量

#include 

int main(int argc,char *argv[])
{
    //每个字符串都是一个地址,这个地址就是指字符串首元素地址
    //字符串常量放在date区,文字常量区
    //字符串常量就是此字符串的首元素地址
    
    printf("s1=%s\n","hello mike");//hello mike代表首元素地址
    printf("s1=%p\n","hello mike");
    printf("s3=%s\n","hello mike"+1);//ello mike
    
    //字符串常量。文字常量区的字符串,只读,不能修改
    
}

(7)字符串常量初始化问题

#include 

int main(int argc,char *argv[])
{
    //p指针保存了hello的地址
    //指针所指向的内存不能修改
    char *p="hello";
    
    //把"hello"一个一个字符放在buf数组中
    //数组的元素可以修改
    char buf[]="hello";
    
    return 0;
}

(8)查找匹配字符串出现的次数

#include 

int main()
{
    char *p="11abcd111122abcd1111abcd1111abcd";
    int i=0;
    chat *tmp=NULL;
    
    while(1)
    {
        //查找匹配字符串,如果找到,返回匹配字符串的地址,没有找到返回空
        tmp=strstr(p,"abcd");
        if(tmp==NULL)//没有找
        {
            break;
        }
        else//找到
        {
            i++;//累加
            
            //重新设置寻找的起点
            p=tmp+strlen("abcd");
        }
    }
}

(9)两头堵模型

#include 

int main(int argc,char *argv[])
{
    char *p="       123445678     ";
    char *start=p;//首元素地址
    char *end=p+strlen(p)-1;//尾元素地址
    
    //从左往右
    while(*start==' '&&*start!='\0')
    {
        start++;
    }
    
    //从右往左
    while(*end=='  '&&end!=p)
    {
        end--;
    }
    
    int n=end-start+1;
    printf("n=%d\n",n);
    
    char buf[100]="aaaaaaaaaaaaaa";
    strncpy(buf,start,n)
    buf[n]=0;//结束符
    printf("buf=%s\n",buf);
}

三、main形参使用说明

#include 

//argv[]:是数组,数组每个元素都是char *,每个元素都是字符地址
//argc:argv[]元素个数
//main()函数参数,需要用户传递
int main(int argc,char *argv[])
{
    int i=0;
    for(i=0;i<argc;i++)
    {
        printf("%s\n",argv[i]);
    }
    return 0;
}

你可能感兴趣的:(指针数组函数(new))