int **指针问题
转自:http://blog.csdn.net/u012501459/article/details/45395571
在打印二维数组时遇到了问题,二维数组可以这样定义int matrix[ROWS][COLUMNS],但是打印二维数组时函数的声明是void printMatrix(int ** numbers,int rows,int columns)。那么将matrix作为参数传递给printMatrix时会出现问题,因为matrix是 int (*)[COLUMNS]类型的,但是函数printMatrix需要的是int **类型的,这两者明显不匹配。
int **从类型上讲是一个指向整型指针的指针,那么如果想要用它来表示一个矩阵需要怎么做呢?因为它的元素是一个指针,如果如果它的每一个元素都表示矩阵的一行,那么它就可以用来表示一个矩阵了。实现代码如下:
//生成矩阵
int ** generateMatrix(int rows,int columns)
{
int **numbers=new int*[rows];
for(int i=;i<rows;i++){
numbers[i]=new int[columns];
for(int j=;j<columns;j++)
numbers[i][j]=i*columns+j;
}
return numbers;
}
int **numbers=new int*[rows];这行代码开始怎么都看不明白,后来突然发现把int*当做一个整体看就明白了。它表示创建了一个大小为rows的数组,这个数组的每一个元素代表一个指针。内存布局如下:
这里numbers是一个指向指针的指针,能够用numbers用来表示矩阵的关键就在于使用new关键字分配的内存是连续的,这样number[i]的地址就可以根据numbers的地址计算出来,因为指针变量占据4个字节的内存区域(32位机器)。
如果不使用上面的方式分配内存,numbers就真的只是一个指向指针的指针了
下面列出几种numbers初始化错误的处理方式及错误的原因:
错误1:
int p[]={,,,}; int **numbers=&p;
这种用法会报如下错误:error:cannot convert "int (*)[4]" to "int **" in initialization int **numbers=&p;
原因是类型不匹配,p是一个指向数组的指针,这个数组中有4个元素,但是&p是一个指向含有4个元素的数组的指针类型(int (*)[4]),借助二维数组中的行指针和列指针很好理解,与int **明显不匹配。
错误2:
如果在上面加上强制类型转换呢? int p[]={,,,}; int **numbers=(int **)&p;
加上强制类型转换后代码编译正常,但是运行直接出错。
下面列出完整的测试代码:
#include <stdlib.h>
#include <stdio.h>
#include <iostream>
//打印矩阵
void printMatrix(int ** numbers,int rows,int columns){
for(int i=;i<rows;i++)
{
for(int j=;j<columns;j++)
std::cout<<numbers[i][j]<<" ";
std::cout<<std::endl;
}
} //生成矩阵
int ** generateMatrix(int rows,int columns)
{
int **numbers=new int*[rows];
for(int i=;i<rows;i++){
numbers[i]=new int[columns];
for(int j=;j<columns;j++)
numbers[i][j]=i*columns+j;
}
return numbers;
}
int main(){
int **numbers=generateMatrix(,);
printMatrix(numbers,,);
//释放内存
for(int i=;i<;i++)
delete [] numbers[i];
delete numbers;
return ;
int **指针问题的更多相关文章
- 函数指针的返回值是指针数组,数组里放的是int;函数指针的返回值是指针数组,数组里放的是int指针
函数指针的返回值是指针数组,数组里放的是int 函数指针的返回值是指针数组,数组里放的是int指针 #include <stdio.h> #include <stdlib.h> ...
- C++入门经典-例5.3例5.4-输出int指针运算后的地址值
1:代码如下: // 5.3.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostream> using ...
- int,char指针探究
#include<iostream> using namespace std; int main() { /* 思路: 1.关于int指针,不可以直接往指针里传值 例:int *a = 4 ...
- C指针(一)
原文链接:http://www.orlion.ga/916/ 一.指针的基本操作 例: int i; int *pi = &i; char c; char *pc = &c; &quo ...
- C指针(二)
原文链接:http://www.orlion.ga/924/ 一.指针与const限定符 const限定符与指针结合起来常见的情况有一下几种: const int *a; int const *a; ...
- c/c++ 函数、常量、指针和数组的关系梳理
压力才有动力,15年中旬就要准备实习,学习复习学习复习学习复习学习复习……无限循环中,好记性不如烂笔头……从数组开始,为主干. c 的array由一系列的类型相同的元素构成,数组声明包括数组元素个数和 ...
- 把《c++ primer》读薄(4-2 c和c++的数组 和 指针初探)
督促读书,总结精华,提炼笔记,抛砖引玉,有不合适的地方,欢迎留言指正. 问题1.我们知道,将一个数组赋给另一个数组,就是将一个数组的元素逐个赋值给另一数组的对应元素,相应的,将一个vector 赋给另 ...
- 《征服 C 指针》摘录6:解读 C 的声明
一.混乱的声明——如何自然地理解 C 的声明? 通常,C 的声明 int hoge; 这样,使用“类型 变量名;”的形式进行书写. 可是,像“指向 int 的指针”类型的变量,却要像下面这样进行声明: ...
- 访问cv::Mat中的数据时遇到的指针类型问题
在用Opencv的时候由于下图原本的图像尺寸是1111*1111,要进行resize,代码如下: cv::Mat img = cv::imread("//Users//apple//td3/ ...
随机推荐
- 关于Spring注解 @Service @Component @Controller @Repository 用法
@Component 相当于实例化类的对象,其他三个注解可以理解为@Component的子注解或细化. 在annotaion配置注解中用@Component来表示一个通用注释用于说明一个类是一个spr ...
- LeetCode:安排工作以达到最大收益【455】
LeetCode:安排工作以达到最大收益[455] 题目描述 有一些工作:difficulty[i] 表示第i个工作的难度,profit[i]表示第i个工作的收益. 现在我们有一些工人.worker[ ...
- CodeForces - 799B T-shirt buying 【贪心】
题目链接 http://codeforces.com/problemset/problem/799/B 题意 给出N件衣服 pi 表示 第i件衣服的价格 ai 表示 第i件衣服的前面的颜色 bi 表示 ...
- 借助node.js + mysql 学习基础ajax~
很多小白不知道ajax怎么学,所以就弄了个node后台模拟下基本的ajax请求. 环境要求是安装node~ 先上linkMysql.js var mysql = require('mysql') va ...
- [BZOJ4557][JLOI2016]侦查守卫
4557: [JLoi2016]侦察守卫 Time Limit: 20 Sec Memory Limit: 256 MBSubmit: 297 Solved: 200[Submit][Status ...
- 《CSS权威指南(第三版)》---第一章 CSS和文档
主要学习的知识是怎么把CSS和HTML文档关联: 1.这是默认的样式表 <link rel="stylesheet" href="" type=" ...
- <算法导论>高级数据结构--以我的角度看B树(Balanced-Tree)的建增删查
题外话:在博客园看了几篇关于B树的博文确实很有帮助,但是也看到有一些Funny的博文- -比如拿二叉树堂(BinaryTree)而皇之写上B树的帽子. 好了题归正传,B树(Balanced-Tree) ...
- springboot简单介绍
1.springboot简单介绍 微服务架构 Spring Boot 是由 Pivotal 团队提供的全新框架,其设计目的是用来简化新 Spring 应用的初始搭建以及开发过程. 该框架使用了特定的方 ...
- ubuntu14开发环境配置
1 配置JDK1.8 jdk工具从官网下载,我下载到了~/tool目录下,首先进入用户的bash配置目录,打开配置文件: cd ~ vi .bashrc 编辑.bashrc文件,在适当位置或者文件最后 ...
- 介绍 Java 的内存泄漏
java最明显的一个优势就是它的内存管理机制.你只需简单创建对象,java的垃圾回收机制负责分配和释放内存.然而情况并不像想像的那么简单,因为在Java应用中经常发生内存泄漏.脚本代码 本教程演示了什 ...