前面学习了字符串是一种字符数组,又知道了指针变量和数组的关系,这里来看一下指针和字符串的关系。

#include <stdio.h>

int main(void){

  char str = "hello";

  char *ptr = "abcd";  // 这里定义ptr为 char类型的指针, ptr的地址会指向这个字符串的首个字符, 。

  int i;

  for(i=0;i<4;i++){            //

    printf("%c",ptr[i]);   // 或 *(p+i)

  }

  

  printf("%s",ptr);

  

  return 0;

}

//再看一个例子,用指针来计算一个字符串的长度

#include <stdio.h>

//用指针求字符串长度

size_t str_len(const char *p){ //这里的size_t 是 size type ,一种整数类型,这里直接用 int代替size_t当然也许,但是用这样一种特殊的int会使代码更好阅读,因为既知道了数据类型又知道了数据的作用
                //这里要注意,函数通过指针进行操作时,应该避免该函数对指向空间的非必要操作,适当的加上 const,程序不是仅仅实现了功能就行了       

  size_t i=0;
  while(*p++)
    i++;

  return size_t;
}

int main(void){

  char str1[]="hello world";
  int len=0;

  len=str_len(str1);//前面看到这个str_len函数的形参是 char *p ,这里传递的实参是 str1, 说明这种指针参数传递会有一个转换过程,这里是把str1的首字符的地址传了进来
  printf("%d",len);

  return 0;
}

//用指针实现字符串的复制

#include <stdio.h>

char str_copy(char *p,const char *d){

  while(*p++=*d++) //这种写法会先赋值后再自增,

    ;  

}

int main(void){

  char str1[]="hello";

  char str2[]="world";  //如果不指明下标,编译的时候会根据字符数分配空间

            

  str_copy(str1,str2);

  printf("%s",str1);   //str1会变成world,表面上看对了,但还是有疑问,由于前面定义字符串赋值没有给下标,当str2的字符数多于str1的字符数,用这种指针操作可能在str1原来的内存空间范围外赋值,可能会覆盖其他的数据

  return 0;

}

很多函数其实已经封装好了,可以拿来直接用

#include <stdio.h>
#include <string.h>   
#include <stdlib.h>

//常用字符串 函数
int main(void){
char str1[]="hello";
char str2[]="world";
char str3[]="goodidea";

printf("%d",strlen(str1));  // strlen 求字符串长度

strcpy(str1,str2);
printf("%s \n",strcpy(str1,str2)); //strcpy 把一个字符串接到另一个字符串后面

printf("%s \n",strncpy(str1,str3,2)); //strncpy 同上,从n位开始操作

char str5[]="ni ";
char str6[]="hao";

printf("%s \n", strcat(str5,str6)) ;

char str7[]="123";
printf("%d \n", atoi(str7)) ;  // alphanumeric to integer

char str8[]="123";
printf("%d \n", atol(str8)) ;  //alphanumeric to long

char str9[]="12.31";
printf("%d \n", atof(str9)) ; //alphanumeric to float

return 0;
}

c语言学习笔记 - 指针和字符串的更多相关文章

  1. C语言学习笔记--指针与字符串

    字符类型 char(character)是一种整数,也是一种特殊的类型:字符.这是因为 ① 用单引号表示的字符字符字面量:‘a’,'1' ②‘’也是一个字符 ③printf和scanf里用%c来输入. ...

  2. c语言学习笔记 - 指针和数组

    结合内存存储数据的机制,c语言里指针的出现和使用也就不奇怪了,如果先学了内存的一些知识,以及程序运行机制,到了c指针这块就会清晰很多. #include <stdio.h> int mai ...

  3. 吴裕雄--天生自然C++语言学习笔记:C++ 字符串

    C++ 提供了以下两种类型的字符串表示形式: C 风格字符串 C++ 引入的 string 类类型 C 风格的字符串起源于 C 语言,并在 C++ 中继续得到支持.字符串实际上是使用 null 字符 ...

  4. c语言学习笔记.指针.

    指针: 一个变量,其值为另一个变量的地址,即,内存位置的直接地址. 声明: int *ptr; /* 一个整型的指针,指针指向的类型是整型 */ double *ptr; /* 一个 double 型 ...

  5. C语言学习笔记--指针阅读技巧

    1. 指针阅读技巧:右左法则 (1)从最里层的圆括号中未定义的标示符看起 (2)首先往右看,再往左看 (3)遇到圆括号或方括号时可以确定部分类型,并调转方向 (4)重复 2.3 步骤,直到阅读结束 注 ...

  6. C语言学习笔记--指针和数组的关系

    1.数组的本质 (1)数组是一段连续的内存空间 (2)数组的空间大小:sizeof(array_type)*array_size; (3)数组名可看做指向数组第一个元素的常量指针 (4)数组声明时编译 ...

  7. C语言学习笔记--指针概念

    指针也是一种变量,占有内存空间,用来保存内存地址,在32位系统中指针的占用的内存大小为4个字节 1.*号的意义 (1)在指针声明时,*号表示所声明的变量为指针 (2)在指针使用时,*号表示取指针所指向 ...

  8. Go语言学习笔记九: 指针

    Go语言学习笔记九: 指针 指针的概念是当时学C语言时了解的.Go语言的指针感觉与C语言的没啥不同. 指针定义与使用 指针变量是保存内存地址的变量.其他变量保存的是数值,而指针变量保存的是内存地址.这 ...

  9. GO语言学习笔记(一)

    GO语言学习笔记 1.数组切片slice:可动态增长的数组 2.错误处理流程关键字:defer panic recover 3.变量的初始化:以下效果一样 `var a int = 10` `var ...

随机推荐

  1. CSS3 RGBA等于RGB加上opacity吗?

    在我们前端设计里有两篇教程: CSS3 RGBA colors使用说明 css3中opacity属性学习与实践,他们公别介绍了RGBA,RGB,opacity的用法,这里我们把这三个属性放在一起来考虑 ...

  2. Vue项目的配置项

    目录 Vue项目的配置项 配置项 加载全局css文件 加载全局js文件 store仓库的配置和简单用法 BootStrap环境和jQuery的配置 前端后端交互(CORS问题) axios配置项(前端 ...

  3. mysql DOS中中文乱码 ERROR 1366 (HY000): Incorrect string value: '\xC4\xEA\xBC\xB6' for column 'xxx' at row 1

    问题:ERROR (HY000): Incorrect string value: 在DOS中插入或查询中文出现乱码 登入mysql,输入命令:show variables like '%char%' ...

  4. Ansible配置及使用

    使用公私钥实现ssh无密码登录 生成公钥和私钥 ssh-keygen -t rsa 公钥相当于锁id_rsa.pub,私钥相当于钥匙id_rsa 借用ssh-copy-id工具实现无密码登录 ssh- ...

  5. Linux sed命令实现替换文本内容

    /root/data/code-s3201/publish_codex/deploy/db.properties db.properties中的 1.0.0.6 替换为 1.0.0.7 sed -i ...

  6. 【luoguP4721】分治 FFT

    description 给定长度为\(n-1\)的数组\(g[1],g[2],..,g[n-1]\),求\(f[0],f[1],..,f[n-1]\),其中 \[f[i]=\sum_{j=1}^if[ ...

  7. SQL Server Management Studio 的账号密码

    使用“Windows身份验证”方式无法登陆 使用“SQL Server身份验证” 方式无法登陆 解决办法:关闭当前所有服务.通过[Microsoft SQL Server 2008]|[配置工具]|[ ...

  8. thinkphp 获取内容

    如果需要获取渲染模板的输出内容而不是直接输出,可以使用fetch方法. fetch方法的用法和display基本一致(只是不需要指定输出编码和输出类型): 大理石平台规格 fetch('模板文件') ...

  9. C++——虚继承(不要使用,会导致二义性)

    如果一个派生类从多个基类派生,而这些基类又有一个共同的基类,则在对该基类中声明的名字进行访问时,可能产生二义性 总结: 如果一个派生类从多个基类派生,而这些基类又有一个共同 的基类,则在对该基类中声明 ...

  10. 用连接池链接redis

    package com.itheima.utils; import redis.clients.jedis.Jedis; import redis.clients.jedis.JedisPool; i ...