C-二维数组, 字符串, 指针

常用的三种数组初始化:

int arr[][4] = {{元素}, {元素},{元素},{元素}};

二维数组本质:

每个元素是一维数组的特殊一维数组;

二维数组与函数:

1. 同一维数组一样, 当作为函数参数的时候, 函数的内部与数组对应的其实是一个指针

2. 所以在作为函数参数的时候, 需要同时传入行, 列

3. 在形参中的二维数组, 行数可以省略, 但是列数不能省略, 实参中对应的二维数组, 行数可以任意, 但是列数必须保持一致

void test(int rows, int cols, int arr[][cols]);

字符串:

%s的原理,  占位的时候, 直接对应的并不是字符串数组的值,  因为数组名默认代表的是数组首地址,  所以其实对应的是字符串数组的地址

字符串长度:

不能直接sizeof数组长度

普通方法: 从第一个字节开始计数, 直到遇到’\0’为止

字符串常用函数:

6个

上课笔记:

指针:

1. 变量在内存中的存储

1. 不同的变量在内存中占据不同的字节空间

2. 内存当中存储数据最小基本单位:字节, 每一个字节, 都有对应唯一的 地址 ——一个十六进制的数

3. 声明一个变量, 在内存中, 从高字节向低字节分配连续的指定字节数的空间

4. 任何数据在内存中都是以其二进制补码形式存在的, 由低位存到高位存储

5. 变量的值: 变量中存贮的值

6. 变量的地址: 变量的低字节的地址

2. 指针变量

1. 首先它是一个变量

2. 其次它是一个存放地址的变量

3. 然后它存放的是另一个变量的地址

4. 通过这个地址就可以间接的访问另一个变量

5. 声明的时候, 可以把数据类型 和 * 写在一起  int* p1      不要 int *p1(到了后期熟练了随意)

6. 所以不能把一个非地址类型的常量赋给指针

也不能直接把变量赋值给指针

7. 指针变量智能存储和指针变量类型相同的普通变量的地址, 否则会出问题

指针变量作为函数的参数:

1. 为什么要用?: 函数的返回值return只能有一个, 但是很多时候需要函数返回的不止一个值,  这时候, 可以通过定义指针变量作为形参,  通过指针实现地址的传递,  从而直接对形参进行操作,  可以获得多个返回值

2.  通过指针变量, 函数可以不需要值的传递, 而只需地址的传递,  甚至连返回值都不需要,  就可以实现对实参的修改

一点建议:  以后如果需要在函数中使用数组作为参数的时候,  直接写一个指向数组的指针最好

下标(索引)的本质:

1. 指针变量后面可以使用中括弧, 在中括弧中写上下标可以来访问数据

2. p1[n], 完全等价于 *(p1+n),  前提是p1必须是一个指针

3. 只要是指针, 都可以使用中括弧下标

时间: 2024-11-05 21:41:34

C-二维数组, 字符串, 指针的相关文章

程序猿之--C语言细节13(二维数组和指针,&*a[i][0]的理解,数组1[e]和e[1]很可能你没见过)

主要内容:二维数组和指针,&*a[i][0]的理解.数组1[e]和e[1] #include <stdio.h> #define NUM_ROWS 10 #define NUM_COLS 10 int main(int argc, char **argv) {     int a[NUM_ROWS][NUM_COLS], *p, i = 0; // a理解为指向整数指针的指针 即int **     int c, d=2,*test, e[2] = {4,5},f[2][2] = {{

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

今天分析了C语言二维数组和指针的基本理解,感觉有点懵...代码记录一下,如果有大神临幸发现哪里有误,欢迎指正~~~ #include <stdio.h> #include <stdlib.h> #include <string.h> //void func(int p[][]) //这样写等同于void func(int **p) p++移动了四个字节,(*p)++移动了四个字节,不符合二维数组规律 //{ //} //列优先输出的函数(即竖着输出) void func

直观理解C语言中指向一位数组与二维数组的指针

一维数组和指针: 对于一位数组和指针是很好理解的: 一维数组名: 对于这样的一维数组:int a[5];  a作为数组名就是我们数组的首地址, a是一个地址常量 . 首先说说常量和变量的关系, 对于变量来说, 用箱子去比喻再好不过了, 声明一个变量就声明一个箱子,比如我们开辟出一个苹果类型的箱子, 给这个变量赋值就是把盛放苹果的箱子中放入一个实实在在的苹果, 这就是变量的赋值.  而对于数组来说, 就是一组类型相同的箱子中,一组苹果箱子, 可以放入不同的苹果. 一维数组空间: 变量被声明后, 我

例看二维数组,指针,二维数组指针

例程: /****************************************************** * * 文件名:例程 * * 文件描述:例看二维数组,指针,二维数组指针 * * 创建人:Jesse * * 版本号: * * 修改记录: * ******************************************************/ #include <stdio.h> #define ROW 3 #define LINE 3 void main(voi

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}}; // /

程序员之--C语言细节13(二维数组和指针,&amp;amp;*a[i][0]的理解,数组1[e]和e[1]非常可能你没见过)

主要内容:二维数组和指针.&*a[i][0]的理解.数组1[e]和e[1] #include <stdio.h> #define NUM_ROWS 10 #define NUM_COLS 10 int main(int argc, char **argv) {     int a[NUM_ROWS][NUM_COLS], *p, i = 0; // a理解为指向整数指针的指针 即int **     int c, d=2,*test, e[2] = {4,5},f[2][2] = {{

***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

二维数组及指针

首先,看一维数组. []符号是下标运算符,a[i]就是*(a+i) 那么a[i][j] 就是*(a[i]+j)=*(*(a+i)+j) 本人对二级和多级指针的理解:1.抽象上说二级指针的内容是地址的地址.变量A好像跟你捉迷藏似的,你要想找到A,你先得去一个地方把A的地址给找出来,然后再根据这个地址找到A.就类似武侠电影里的宝藏,你要先去一个人的背上发现藏宝图,然后再根据藏宝图里画的地址找到宝藏,在这里,这个人的背就是一个最外层的地址,藏宝图就是内层的地址.2.对于二级指针和多级指针,定义时,我们

二维数组和指针

二维数组和指针⑴ 用指针表示二维数组元素.要用指针处理二维数组,首先要解决从存储的角度对二维数组的认识问题.我们知道,一个二维数组在计算机中存储时,是按照先行后列的顺序依次存储的,当把每一行看作一个整体,即视为一个大的数组元素时,这个存储的二维数组也就变成了一个一维数组了.而每个大数组元素对应二维数组的一行,我们就称之为行数组元素,显然每个行数组元素都是一个一维数组 下面我们讨论指针和二维数组元素的对应关系,清楚了二者之间的关系,就能用指针处理二维数组了.设p是指向数组a的指针变量,若有:p=a

C二维数组用指针地址遍历

#include <stdio.h> #include <stdlib.h> int main(){ int a = 100; void *p = &a; printf("a:%d address:%p\n",*(int*)p, &a); //unsigned int *pt = (unsigned int*)0xbfa70ee8; int *pt = (int*)malloc(sizeof(int)); *pt = 200; printf(&q