统计相同字符串字数

段错误,无效空地址的指针的引用会发生错误。

const指针,

const int *p 与int* const p 区别:

前者是固定了指针所指地址内存中的数据不可变

后者是固定了指针地址不可变。

限制p,即固定了地址。

限制了*p就固定了数据。


野指针,地址有效但无可用数据。

*p++ = j+i;给指针*p赋值。



数组就是指针:(之间也有很大的区别,指针没有内存空间来存放数据,数组有内存空间可以存放数据)。

array[]是一维数组;

p = array;//p = &array[0]

int array[5];


array = array[0];


array[4] = *(array+4);


指针的下标形态:

int* p;

array[4] = p[4];


指针排序:


    int flag = 0;

    for(int i = 0;i<n;i++){

        for(int j = 1;j<n-i;j++){

            if(*p<*(p+j)){

                flag = *p;

                *p = *(p+j);

                *(p+j) = flag;

            }

        }

        printf("array[%d] = %d \n",i,*p);

        p++;

    }



指针+内存+char数组:

http://blog.csdn.net/iamfranter/article/details/6826248



添加头文件:#include<stdlib.h> free(viod);释放指针。

指针与数组的区别:

char* p = “hello”;

p[0] = ‘X’;//不能成功赋值:编译器不会觉得没有什么不妥,但是表达式企图改变常量值是不能够通过的。

char a[] = “hello”;

a[0] = ‘X’;//成功,这是数组的赋值,与指针相比,指针不会被分配内存,而数组可以被分配内存。所以 a[0] = ‘X’成功编译。


char数组的比较不能用“==”或“!=”,要用strcmp();而且赋值不能用a = b;而是要用:strcp(a,b);(把b赋值给a)。


计算内存容量sizeof(int);

char* p = “123”;

对strlen的掌握,它没有包括字符串末尾的’\0'。


char chr[3];

strcpy(chr,p);//出错,strcpy在为把“123”复制到chr之后结束时会把结束标示“\0”作为一个元素添加到chr中,如果chr的元素不够,便会出错。

而且如果一个数组中被重新全部赋值后(包括\0位),strcp()方法在操作时若是找不到“\0”标示符,strcpy会一直赋值下去,即便被赋值数组越界。




野指针:野指针不能够被使用,不可以被赋值。//int *p; *p = *pn; 或*pt = *p;都是不被允许的,因为野指针有可能指向系统区,而系统区的数据是不可以被更改的。


数组指针的使用。

#include<stdio.h>

#include<stdlib.h>

#include"time.h"

int main(){

     char *p[5] = {NULL};

     srand((unsigned)time(NULL));

0. //sum取1-10之间的整数;

     int i,sum = rand()%10+1;

     for(i = 0;i<sum;i++){

1. //给每个元素申请内存空间

         p[i]=(char *)malloc(sizeof(char)*100);

2. //检查每个指针的值是否位NULL,NULL不可被使用(用来存储数据);

if(p[i]==NULL) break;

else  scanf("%s",p[i]);

     }

     for (i=0; i<sum; i++) {

          printf("%s\n",p[i]);

     }

for(int i = 0;i<5;i++){

3. //指针数组使用完毕需要被释放内存

free(p[i]);

4. //被释放内存的指针数组需要被置空:NULL,防止产生野指针。

p[i] = NULL;

}

     return 0;

}

内存分配:

内存的静态存储区:常量(值不可被修改)

栈上分配:局部变量(生存周期短,不可被return使用。)

堆上非配:user申请的,亲自申请的内存存储空间需要手动释放,要不然会造成内存泄露,而且释放之后的指针要置为NULL,要不然会生成野指针。

p+=6;  p = p+6;


函数参数不超过4个。





数组指针:

#include<stdio.h>

#include<stdlib.h>

#include"time.h"

int main(){

     int carray[2][5] = {2,6,8};


//int [5] carray[2];

//int [5] *pp;

int (*pp)[5] = NULL;

pp = carray;

//*pp = &carray[0];*(pp+1) = &carray[1];     

     printf("%d",*(carray[0]+1));

     

//看懂就懂了。

//pp = carray;

//carray默认等于carray[0]地址。

//*pp = carray = carray[0] 

//*(pp+1) = carray[1]

//*pp+1 =carray[0]+1 = carray[0][1] 


     return 0;

}

详解:

*pp:指针变量指向内存中的数据

&pp:指针变量的地址

  pp:指针变量所指向的地址(存储的地址)。






二位数组作为函数参数,a[][5]中的5不可少。否则报错。

数组指针PK指针数组?

数组指针:int (*p)[5]

可写成:    int[5] *p

指针*p是一个指向数组int[5]的指针


指针数组:int* p[5]

一个包含5个指针的数组。


使用指针数组的元素来遍历数组元素。

#include<stdio.h>

#include<stdlib.h>

#include"time.h"

int main(){

     int array[10] = {2,5,6,4,7};

     int *parray[5]  = {NULL,NULL,array+1};

     //printf("parray[0] = %p",parray[0]);

     for(int i= 0;i<5;i++){

          printf("%d\n",*(parray[2]+i-1));

     }

     for(int i = 0;i<5;i++){

          parray[i] = (int*)malloc(sizeof(int)*100);

     }

     for(int i = 0;i<5;i++){

          free(parray[i]);

          parray[i] =NULL;

     }

     return 0;

}

#include<stdio.h>

#include<stdlib.h>

#include"time.h"

int main(int a,char* arg[]){

     

//     printf("%c\n",arg[1][2]);

//     printf("%c\n",*(arg[2]+0));

//     printf("%c\n",*(arg[2]+1));

 //从arg[2]所指向字符串的第二个元素开始输出,直到结尾

     printf("arg[2]+2 = %s\n",arg[2]+2);

 //输出的时arg[2]所指向字符串的第二个元素。

     printf("*(arg[2]+2) = %c\n”,*(arg[2]+2));

 //从arg[3]所指向的第二元素开始输出,直到结尾

     printf("arg[3]+2 = %s\n",arg[3]+2);

     char arr[20] = "you are SB";

     arg[4] = arr;

     printf("arg[4]+4 = %s\n",arg[4]+4);

     

     printf("arg[0]+132 = %s\n",arg[0]+132);

     

     

     

     int array[10] = {2,5,6,4,7};

     return 0;

}

使用指针数组:

可以选择从数组的某个元素开始遍历输出。

也可以输出单个数组元素。

一个指针数组的每一个元素可以用来遍历任意一个数组。





//从指定的字母开始读取后续字符串

方法一:


#include <stdio.h>

#include<stdlib.h>

char *p(char* s,char ch,int* ints);

int main(int argc, constchar * argv[]) {

   int index =0;

   char string_buffer[] ="hello world";

   char* ret =NULL;

   int i =1;

    

    ret =p(string_buffer,'r', &index);

    

//    while (*(ret+i)!='\0') {

//        printf("%c",*(ret+i));

//        i++;

//    }

   printf("\n%s\n",ret+1);

   return0;

}

char *p(char *s,char ch,int* ints){

    //排错:开始:

   if(!s){

        perror("char* s==NULL");

       exit(-1);

    }

   if(!ch){

        perror("char ch==NULL");

       exit(-1);

    }

   if(!ints){

        perror("int* ints == null");

       exit(-1);

    }

    //排错:结束;

   int i =0;

   char* pp =NULL;

   if(s[i]=='\0'){

        perror("s[i]=='\0'");

       exit(-1);

    }

   while (s[i]!=ch) {

        pp = &s[i];

        i++;

    }

//  printf("%s",pp);

   return pp;

}


方法二:


#include<stdio.h>

#include<stdlib.h>

char *p(char* str,char* ch,int* index);

int main(){

   char string_buffer[] ="hello world";

   char ch  =' ';

   int* index =NULL;

   char* prin =p(string_buffer, &ch, index);

   printf("%s\n",(prin+1));

    

   return0;

}

char *p(char* str,char* ch,int* index){

    //排错:开始:

   if(!str){

        perror("char* s==NULL");

       exit(-1);

    }

   if(!ch){

        perror("char ch==NULL");

       exit(-1);

    }

   if(!index){

        perror("int* ints == null");

       exit(-1);

    }

    //排错:结束;

   printf("ch = ");

   scanf("%s",ch);

       printf("\n");

//    ch = 'o';

   int i =0;

   while (str[i]!=*ch) {

        index = (int*)&str[i];

        i++;

    }

   printf("%s\n",(char*)index);

   return (char*)index;

}


方法三:回调方法:

#include <stdio.h>

#include<stdlib.h>

typedefint (*phunt_t)(char* str,char* ch,int* index);

int operate(char* str,char* ch,phunt_t phunt);

int find(char* str,char* ch,int* index);

int main(){

   char str_buf[] ="hello world";

   char ch =' ';

   int index =0;

   int (*p)(char*,char*,int*);

    p =find;

    index=operate(str_buf, &ch, p);

    printf("out  index = %d\n",index);

   for (int i = index; i<11; i++) {

       printf("%c",str_buf[i]);

    }

   printf("\n");

       return0;

}

int operate(char* str,char* ch,phunt_t phunt){

   if(!str){

       perror("str==NULL");

       exit(-1);

    }

   if(!ch){

       perror("ch==NULL");

       exit(-1);

    }

   int index =0;

    index =  phunt(str,ch,&index);

    printf("index = %d\n",index);

   return index;

}

int find(char* str,char* ch,int* index){

   if(!str){

       perror("str==NULL");

       exit(-1);

    }

   if(!ch){

       perror("ch==NULL");

       exit(-1);

    }

   if(*index!=0){

       perror("*index!=0");

       exit(-1);

    }

   printf("ch = ");

   scanf("%s",ch);

   printf("\n");

   int i =0;

   while (str[i]!=*ch) {

        i++;

    }

    printf("inside index = %d\n",i);

   for(int i = *index;i<11;i++){

       printf("%c",str[i]);

    }

   printf("\n");

   return i;

}

进出栈浅:

#include <stdlib.h>

#include <stdio.h>

typedefstruct stu {

   int data;

   structstu* node;

    }phunt_t,*phunt;

int main(){

   phunt put =NULL;

   for(int i =0;i<6;i++){

       phunt pp = (phunt)malloc(sizeof(phunt_t));

        pp->data = i;

        pp->node =put;

        put = pp;

    }

   for(int i =0;i<6;i++){

       printf("%d\n",put->data);

        put = put->node;

    }

   return0;

}


把两串字符串合二为一:

#include <stdlib.h>

#include <stdio.h>

void join(char* a[]);

int main(void){

   char* a[2] = {NULL};

//    printf("%d",a[1]);

   int i =0;

   for(i =0;i<2;i++){

        a[i] = (char*)malloc(sizeof(char)*100);

       scanf("%s",a[i]);

    }

   join(a);

   printf("%s\n",a[0]);

    

       return0;

}

void join(char* a[]){

   char* b[1] = {NULL};

   char* p1 =NULL;

   char* p2 =NULL;

   char* p3 =NULL;

    b[0] = (char*)malloc(sizeof(char)*100);

    p3 = b[0];

    p1 = a[0];

    p2 = a[1];

   int i =0,j =0,l =0;

   while(p2[i]!='\0'){

       while(p1[j]!='\0'){

//            printf("%c\n",p1[j]);

            p3[l] = p1[j];

            l++;

            j++;

           if(p1[j]=='\0'){p1[j+1] = '\0';}

        }

        p3[l] = p2[i];

        l++;

        i++;

    }

//    printf("b[0] = %s\n",b[0]);

    a[0]  = b[0];

}

实现一个函数,传递一个字符数组,返回字符数组中的整数值,并在main函数中输出。

例如:

输入:134a231b

输出:134

输入:-129cde

输出:-129

#include <stdio.h>

#include <stdlib.h>

void cut(char* a[]);

int main(){

    char* p[1] = {NULL};

    p[0] = (char*)malloc(sizeof(char)*100);

    scanf("%s",p[0]);

    cut(p);

    printf("%s\n",p[0]);

    free(p[0]);

    p[0] = NULL;

    return 0;

}

void cut(char* a[]){

    char* p = NULL;

    p = a[0];

    int i = 0;

    //43-45/48-57

    while ((p[i]<58&&p[i]>47)||(p[i]<46&&p[i]>42)) {

        i++;

        if (p[0] == '\0') {

            break;

        }

    }

//    printf("0 = %d 9 = %d '-' = %d '+' = %d \n",p[0],p[1],p[2],p[3]);

    if (p[i]=='\0') {}

    else p[i] = '\0';

}




实现一个函数,传递一个有10个已经排好序的整形元素数组(数组大小实际为11)中,将一个指定的值按顺序插入,并在main函数中将插入后的数组输出。

比如:

输入:

1 2 4 5 6 7 8 9 10 11

3

输出:

1 2 3 4 5 6 7 8 9 10 11

#include <stdio.h>

#include <stdlib.h>

void cut(int a[],int p);

int main(){

    int a[11];

    int n = 0;

    int i = 0;

    for(i = 0;i<10;i++){

        scanf("%d",&a[i]);

    }

    scanf("%d",&n);

    cut(a, n);

    for (i= 0; i<11; i++) {

        printf("%d",a[i]);

    }

    return 0;

}

void cut(int a[],int n){

    int i = 0,j = 0;

    

    if (a[i]<=n) {

        

        while (a[i]<=n) {

            i++;

            

        }

        int *pp = &a[i];

        for (j = 11-i; j>=0; j--) {

            *(pp+j) = *(pp+j-1);

        }

        *pp = n;

    }

    else{

        

        

        while (a[i]>=n) {

            i++;

            

        }

        int *pp = &a[i];

        for (j = 11-i; j>=0; j--) {

            *(pp+j) = *(pp+j-1);

        }

        *pp = n;

    

    

    }

    

    

}







#include <stdio.h>

#include <stdlib.h>

void find(char* p[],char* pa[],int* n);

int main(){

    char* p[1] = {NULL};

    char* pa[1] = {NULL};

    int n = 0;

    p[0] = (char*)malloc(sizeof(char)*100);

    pa[0] = (char*)malloc(sizeof(char)*100);

    scanf("%s",p[0]);

    scanf("%s",pa[0]);

    find(p, pa, &n);

    printf("%d\n",n);

    return 0;

}

void find(char* p[],char* pa[],int* n){

    int i = 0;

    int j= 0;

    int l = 0;

    while (p[0][i]!='\0') {

        l = i;

        while (p[0][i]==pa[0][j]) {

            j++;

            printf("p[0][%d] = %c pa[0][%d] = %c\n",i+1,p[0][i+1],j,pa[0][j]);

            if(p[0][i+1]!=pa[0][j])j = 0;

            if (pa[0][j]=='\0') {

                (*n)++;

                j = 0;

            }

            i++;

            

        }

        i = l;

        i++;

    }

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值