指针数组

学习补漏:指针数组与双重指针形成的二维数组的异同

怎甘沉沦 提交于 2019-12-17 01:28:12
暴露的问题 : (1):对指针数组形成二维数组的理解不深 (2):对普通指针与指针数组的内存情况产生混淆 (3):对new生成的二维数组的delete方法 问题(1):指针数组构建二维数组的原理: 心得理解: ①:指针数组本身就形成了一层数组,若要形成二维数组,仅仅需要新增一层数组内存 ②:所以单纯的指针变量若要形成二维数组,需要形成两层数组(形成指针数组–>形成二维数组) 问题(2):普通指针与指针数组内存情况混淆 (√): int * * p ; //定义双层指针; //【1】正确的写法 //****①分配指针数组内存 p = new int * [ n ] ; //****②由指针数组生成二维数组 for ( int i = 0 ; i < n ; i ++ ) { p [ i ] = new int [ n ] ; //开辟第二层(非指针内存) } //【2】错误的写法 //****①:混淆双层指针与指针数组的内存情况 for ( int i = 0 ; i < n ; i ++ ) { p [ i ] = new int [ n ] ; } //原因分析: 双层指针只分配有单一内存(4个字节),而没有分配相应的内存。 //*****②:混淆动态开辟内存的原理: 错误: int * * p = new int [ n ] ; 分析: ( 1 ) int * p = new

数组和指针

谁说胖子不能爱 提交于 2019-12-16 23:17:38
#include<stdio.h>#include<stdlib.h>int main(){ char pstr; int n; char temp; int i, j, flag = 0, flag1 = 0; scanf("%d", &n); while (getchar() != ‘\n’); pstr = (char )malloc(n * sizeof(char)); gets(pstr); temp = pstr[0]; for (i = 0; pstr[i] != ‘\0’; i++) { if (pstr[i] > temp) { temp = pstr[i]; flag = 1; } else if (pstr[i] < temp) { flag1 = 1; } } if (flag|| flag1) { for (i = 0; pstr[i] != ‘\0’😉 { if (pstr[i] == temp) { for (j = i; pstr[j] != ‘\0’; j++) { pstr[j] = pstr[j + 1]; } } else { i++; } } } puts(pstr);}/ 指针:一般函数中传值传递,可以用return某个值返回函数结果,但return是选择性地,也就是说一个函数中只有一个return

数组和指针

╄→гoц情女王★ 提交于 2019-12-16 22:54:26
#include<stdio.h>#include<stdlib.h>int main(){ char pstr; int n; char temp; int i, j, flag = 0, flag1 = 0; scanf("%d", &n); while (getchar() != ‘\n’); pstr = (char )malloc(n * sizeof(char)); gets(pstr); temp = pstr[0]; for (i = 0; pstr[i] != ‘\0’; i++) { if (pstr[i] > temp) { temp = pstr[i]; flag = 1; } else if (pstr[i] < temp) { flag1 = 1; } } if (flag|| flag1) { for (i = 0; pstr[i] != ‘\0’😉 { if (pstr[i] == temp) { for (j = i; pstr[j] != ‘\0’; j++) { pstr[j] = pstr[j + 1]; } } else { i++; } } } puts(pstr);}/ 指针:一般函数中传值传递,可以用return某个值返回函数结果,但return是选择性地,也就是说一个函数中只有一个return

指针复杂声明

Deadly 提交于 2019-12-16 22:03:34
转载自:http://blog.csdn.net/tiantangniao232/article/details/1851003 在前两篇文章都理解的基础上,本篇文章将教你如何去理解指针的复杂声明。 首先先介绍一下 左右法则:其实就是------向右看,向左看 首先找到变量名,然后向右看,遇到括号改变阅读方向,重复这个过程,直到解析完整个表达式。 看到上面的法则,如果没有接触过这个法则,可能会不知所云。 下面就通过一些具体的例子来教你如何理解复杂的指针声明: 第一个: int (*p)[3]; 1-----首先找到变量名 p ,从变量名向右看是括号,依据法则改变解析方向,向左看,有一个 * 说明 p是一个指针,至此我们知道 p 是一个指针,至于是什么样的指针需要更进一步的解析。 2-----解析完括号向右看 是一个 [3],是一个具有3个整型元素数组,所以 p 就是一个指向这个数组的指针,学名数组指针。 第二个: int (*func)(int *p); 1-----首先找到变量名 func,从变量名向右看是括号,依据法则改变解析方向,向左看,有一个* 说明 func是一个指针,至此我们知道 func是一个指针,至于是一个什么样的指针需要更进一步解析。 2-----解析完括号向右看,发现 func是一个函数指针,参数类型是 int * ,返回值是 int 第三个: int (

16.go语言基础学习(上)——2019年12月16日

我的未来我决定 提交于 2019-12-16 17:04:04
2019年12月13日10:35:20 1.介绍 2019年10月31日15:09:03 2.基本语法 2.1 定义变量 2019年10月31日16:12:34 1.函数外必须使用var定义变量 var a=1 b:=5 声明变量的一般形式是使用 var 关键字: var name type 其中,var 是声明变量的关键字,name 是变量名,type 是变量的类型。 2.没有全局变量说法,只有包变量 3.集中定义变量 var ( a int c string d bool ) 4.使用var关键字 var a,b,c bool var s1,s2 string="hello","world" 5.使用:=定义变量 只能在函数体内使用 a,b,c:=1,2,"123" 6.基本类型 Go语言的基本类型有: bool string int、int8、int16、int32、int64 uint、uint8、uint16、uint32、uint64、uintptr byte // uint8 的别名 rune // int32 的别名 代表一个 Unicode 码 float32、float64 complex64、complex128 7.源代码: package main import "fmt" var ( a int c string d bool ) func main()

C语言博客作业06--结构体&文件

别说谁变了你拦得住时间么 提交于 2019-12-16 13:53:17
1.本章学习总结 1.1 学习内容总结 1.结构的介绍 结构(Structure)类型是一种允许程序员把一些数据分量聚合成一个整体的数据类型,一个结构中包含的每个数据分量都有名字。这些数据分量称为结构成员或者结构分量,结构成员可以是C语言中的任意变量类型,程序员可以使用结构类型来创建适合于问题的数据聚合。 像数组和指针一样,结构也是一种构造数据类型(或叫派生数据类型),它与数组的区别在于:数组中所有元素的数据类型必须是相同的,而结构中各成员的数据类型可以不同。 2.结构是C语言中一种新的构造数据类型,它能够把有内在联系的不同类型的数据汇聚成一个整体,使它们相互关联;同时,结构又是一个变量的集合, 可以按照对基本数据类型的操作方达单独使用其成员变量。 3.在C语言中,整型、实型等基本数据类型是被系统预先定义好了的,程序员可以用其直接定义变量。而结构类型是由用户根据需要,按规定的格式自行定义的数据类型。 4.结构类型定义的一般形式为: struct 结构名 { 类型名 结构成员名1; 类型名 结构成员名2; … 类型名 结构成员名n; }; 5.struct是定义结构类型的关量字,在struct之后,自行命名一个结构名,它必须是一个合法的C标识符。struct与结构名两者合起来共同组成结构类型名,大括号内的内容是结构所包括的结构成员,也叫结构分量。结构成员可以有多个,这样

洛谷大佬的题解 p1427小鱼倒数字

淺唱寂寞╮ 提交于 2019-12-16 10:06:14
滑稽题解第一弹 大家好,我是一个入门一年还在入门的蒟蒻。 今天天气不错,我决定回新手村看看。 然后我就随手点开了一个题。 看到题面一开始我有点惊……现在新手村就开始用栈了吗? 然而事后我发现这个题好像并没有想象中的那么难…… 于是我就尝试性地交了一个学了一年后的入门水平代码…… #include #include using namespace std; stack a; int k; int main(){ while(cin>>k) a.push(k);a.pop();//这种输入方式在本地调试的时候需要在输入结束后按Ctrl+Z来结束输入 while(!a.empty()) cout<<a.top()<<" ",a.pop(); return 0; } 然后我们机房的c姓神犇就来指点了一下,然后诊断出我患有重度STL依赖症…… 我看了一下我之前的代码: #include using namespace std; int x[100],c=0; int main(){ for(int i=0;;i++){ cin>>x[i]; if(x[i]==0) break; c=i; } for(int j=c;j>=0;j–) cout<<x[j]<<" "; return 0; } 然后我就突发奇想,这个题是不是可以一题多解呢? 我觉得可以的。

c语言字符串处理笔记【自用·长期更新】

萝らか妹 提交于 2019-12-15 03:20:32
字符数组和字符串的定义和使用 一维char数组 char str1 [ ] = "This is a string" ; char str2 [ ] = { 'a' , 'b' , 'c' , '\0' } ; char str3 [ 50 ] = "This is a string" ; char * str4 = "This is a string" ; char str5 [ ] [ ] 在C语言中,字符串总是以’\0’作为串的结束符。字符串会在末尾自动添加,而如果使用第二种初始化方式则需要在末尾添加’\0’。 str4是一个char型指针,指向字符串所占用内存区域的首位,这里指向字符’T’,由于它是一个指针类型所以可以改变其指向的位置。 ‘\0’:是ASCII码表中的第0个字符,用NUL表示,称为空字符。该字符既不能显示,也不是控制字符,输出该字符不会有任何效果,它在C语言中仅作为字符串的结束标志。 二维char数组 char str1 [ 2 ] [ 10 ] = { "hello" , "world" } ; char str2 [ ] [ 10 ] = { "hello" , "world" } ; char * str3 [ 10 ] { "hello" , "world" } ; char * s [ 10 ] = { str1 [ 0 ] } ; char (

关于数组还有指针那些事情

蓝咒 提交于 2019-12-15 01:05:37
目前Pproject 遇到一些问题,是把所有点的xyz坐标,用循环的方式读取,形成一个二维数组,然后将该二维数组转化为一维数组。运算中的矩阵是三行N列的,第一行是所有点的X坐标,第二行是所有点的Y坐标,第三行是所有点的Z坐标。 在这里先补充一点指针的知识: 二维数组和指针⑴ 用指针表示二维数组元素。要用指针处理二维数组,首先要解决从存储的角度对二维数组的认识问题。我们知道,一个二维数组在计算机中存储时,是按照先行后列的顺序依次存储的,当把每一行看作一个整体,即视为一个大的数组元素时,这个存储的二维数组也就变成了一个一维数组了。而每个大数组元素对应二维数组的一行,我们就称之为行数组元素,显然每个行数组元素都是一个一维数组。 下面我们讨论指针和二维数组元素的对应关系,清楚了二者之间的关系,就能用指针处理二维数组了。 设p是指向二维数组a[m][n]的指针变量,则有:int* p=a[0]; 此时P是指向一维数组的指针。P++后,p指向 a[0][1]。如果定义int (*p1)[n];p1=a;p1++后,p1指向a[1][0]; 则p+j将指向a[0]数组中的元素a[0][j]。由于a[0]、a[1]┅a[M-1]等各个行数组依次连续存储,则对于a数组中的任一元素a[i][j],指针的一般形式如下:p+i N+j 相应的如果用p1来表示,则为 (p1+i)+j 元素a[i][j

三数之和 算法 双指针

帅比萌擦擦* 提交于 2019-12-15 00:47:04
题目描述 给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组。 注意:答案中不可以包含重复的三元组。 例如, 给定数组 nums = [-1, 0, 1, 2, -1, -4], 满足要求的三元组集合为: [ [-1, 0, 1], [-1, -1, 2] ] 主要是需要去重 来源: CSDN 作者: Emily_1021 链接: https://blog.csdn.net/Emily_1021/article/details/103544164