8.31 二维数组 字符串和指针

指针+1移动了相当于所指向类型的大小的字节

int *s1[100]

移动了4个字节

int (*s2)[100]

移动了400个字节

char *s3

移动了1 个字节

int *s4

移动了4个字节

***p2如何理解?

int *p0 = &i

*p0  = i

int **p1 = &p0

**p1 = i

int ***p2 = &p1

***p2 = i

*p2 = p1的值

**p2 = p0的值

***p2 = i的值

所以***p2就是p0的值        而p0的值最后指向了p2的地址

即***p2指向了p2的地址

二维数组  +   数组指针  +  二级指针

  1. int a[3][4] = { { 0, 1, 2, 3 }, { 4, 5, 6, 7 }, { 8, 9, 10, 11 } };//二维数组
  2. int(*p)[4] = a; //数组指针
  3. printf("%d\n", p); //8322788 这是个第一行的行地址,类似于二级指针
  4. printf("%d\n", *p); //8322788 这是个第一行第一列的地址
  5. printf("%d\n", **p); //0 这是第一个值

*(*(p+j)+i)

p是第一行的行地址,

二维数组里的 *(p+j)是个指针地址

ps :参数里

二维数组等价于数组指针

二级指针等价于指针数组

二维数组传参:


按列优先打出来数组内容

  1. #include <stdio.h>
  2. int main()
  3. {
  4. int a[3][4] = { { 0, 1, 2, 3 }, { 4, 5, 6, 7 }, { 8, 9, 10, 11 } };
  5. int(*p)[4] = a;
  6. for (int i = 0; i < 4;i++)
  7. {
  8. for (int j = 0; j < 3; j++)
  9. {
  10. printf("%d ",*(*(p+j)+i));
  11. }
  12. printf("\n");
  13. }
  14. return 0;
  15. }

二维数组传参要传两个维度


const:

如果不改变值,尽量使用const

回调函数:

把函数的指针作为一个函数的参数,叫做回调函数

strcpy :

  1. #include <stdio.h>
  2. #include <string.h>
  3. void str_cpy( char * dest , const char * src)
  4. {
  5. while(*dest++ = *src++);
  6. }
  7. int main()
  8. {
  9. char buf[100] = "aaaaaaaaaaaaaaaaaaaaaaaa"; //用来测试是否添加\0
  10. str_cpy(buf , "liuwei");
  11. printf("%s\n" , buf);
  12. return 0;
  13. }



strncpy:

  1. #include <stdio.h>
  2. #include <string.h>
  3. void str_ncpy( char * dest , const char * src , int n)
  4. {
  5. while( (*dest++ = *src++) && n--);
  6. *(dest-1) = 0;
  7. }
  8. int main()
  9. {
  10. char buf[5] = "aaaa";;
  11. str_ncpy(buf , "liuweinihao" , 6);
  12. printf("%s\n" , buf);
  13. return 0;
  14. }

字符串和指针

  1. #include <stdio.h>
  2. int main()
  3. {
  4. int i;
  5. char s[100] = "a刘威b";
  6. printf("%d\n", s[0]);
  7. printf("%d\n", s[1]);
  8. printf("%d\n", s[2]);
  9. printf("%d\n", s[3]);
  10. printf("%d\n", s[4]);
  11. printf("%d\n", s[5]);
  12. return 0;
  13. }

汉字由两个字节构成

192 245 是刘

-63  -11

205 254 是威

-51   -2

自己写一个strlen 类似 mb_strlen 汉字只算一个字符

  1. #include <stdio.h>
  2. #include <string.h>
  3. int mb_strlen(const char * p)
  4. {
  5. int len = 0;
  6. while( *p )
  7. {
  8. len++;
  9. if(*p++ < 0)
  10. p++;
  11. }
  12. return len;
  13. }
  14. int main()
  15. {
  16. char *s = "a我b是c你d大e";
  17. int len = mb_strlen( s );
  18. printf("%d\n",len);
  19. return 0;
  20. }

来自为知笔记(Wiz)

时间: 2024-10-08 11:13:24

8.31 二维数组 字符串和指针的相关文章

编程题:指向二维数组元素的指针变量。功能:已知二维数组a[2][3],输入输出全部元素。

#include<stdio.h> void main() { int a[2][3],i,j; int *p; /*用坐标法输入二维数组元素*/ for(i=0;i<2;i++) for(j=0;j<3;j++) scanf("%d",&a[i][j]); /*用指针法输出二维数组元素*/ p=a[0];         /*等价于p&a[0][0];*/ for(;p<a[0]+6;p++)   printf("%4d&quo

C语言--二维数组,字符串数组,多维数组

#import <Foundation/Foundation.h> int main(int argc, const char * argv[]) { // int a[2][3]={ // {1,2,3}, // {4,5,6} // }; // int a[2][3]={1,2,3,4,5,6}; // //打印单个元素 // printf("%d",a[1][1]); // //元素没赋全,默认为0 // int b[2][3]={{1,2,3},{4}}; // /

***php解析JSON二维数组字符串

客户端的请求体中的数据:[{"msg_id": 1, "msg_status": "HAS_READ" }, { "msg_id": 2, "msg_status": "HAS_READ" }] 是一个二维数组字符串 $json_data = json_decode($GLOBALS['HTTP_RAW_POST_DATA'], true);其实用这一句即可实现JSON二维数组字符串转P

二维数组与双重指针(转)

原文地址:https://blog.csdn.net/u013684730/article/details/46565577 一.简介 1.二维数组 int array[10][10];    函数声明: void fun(int a[][10])    函数调用:fun(array);   访问: 一般使用a[i][j]来访问数组中的元素 2.指针数组 int *array[10];    函数声明:void fun(int *a[10]);    函数调用:fun(array);    访问

C语言笔记(二维数组与数值指针)

一.关于二维数组和二维数组区别 (1)一维数组在内存中是连续分布存储的,同样,二维数组也是在内存连续存储的.所以从内存的角度来分析,一维数组和二维数组其实没有本质区别. (2) 二维数组可以使用一维数组来代替.但是在实际的应用中,有时候使用二维数组会更加直观,方便程序的编程. (3)两者在内存使用效率上是一模一样的. 二.二维数组的第一维和第二维概念 (1)例如 int a[2][5]中,前面的2表示第一维:后面的5表示第二维 (2) 二维数组的第一维表示最外部的那一层,第一维本身也是一个数组,

二维数组和二级指针作为参数传给参数的方式

  一.如果要将二维数组传给一个函数,有几种传参方式?     1).直接将二维数组传给函数.     eg:         void test(int arr[3][4]); 2).以数组指针的方式传入.     eg:         void test(int (*arr)[4]); 第一种方式很容易理解.第二方式我们来分析分析.首先将二维数组看作是一个一维数组,有三个元素,arr[0],arr[1],arr[2].每个元素中有四个元素.例如,(arr[0])[0],(arr[0])[1

C++ 二维数组(双重指针作为函数参数)

本文的学习内容参考:http://blog.csdn.net/yunyun1886358/article/details/5659851 http://blog.csdn.net/xudongdong99/article/details/6723163 1.使用二维数组作为形参的例子: void func(int arr[][10]) { } int main() { int array[10][10]; func(array); //用二维数组名作为实参,调用函数 } 上面的例子可以编译通过,

C语言二维数组字符串的赋值

今天用到了二维数组作为参数传递的程序,通过网上搜索,针对自己遇到的问题做个整理. 1.在被调用函数的形参数组定义可以省略第一维的大小,第二维不可省略,如下: void fun(int a[5][20]); //合法 void fun(int a[][20]); //合法 void fun(int a[5][]); //不合法 void fun(int a[][]); //不合法 将二维数组作为形参时,第一维大小可以省略,第二维不可省略,这是有编译器原理限制的,在内存中按数组排列规则存放(按行存放

二维数组和指向指针的指针

引用地址: http://www.cnblogs.com/stoneJin/archive/2011/09/21/2184211.html 一道面试题引发的问题,首先要知道[]的优先级高于*,题目: char **p,a[6][8]; 问p=a是否会导致程序在以后出现问题?为什么? 直接用程序说明: #include<stdio.h> void main(){ char **p,a[6][8]; p = a; printf("\n");} 编译,然后就会发现通不过,报错:错