二级指针

20180315 代码错题(10)

冷暖自知 提交于 2020-02-28 00:51:47
下列程序的输出结果是() 10,30,60 20,40,60 10,20,30 10,30,50答案 C  错选 A指向数组的指针即为二级指针 n是一个2行3列的数组,p首先指向n的第一个元素 p[0][0]=n[0][0]=10 p[0]为数组第一行首地址,p[0]+1即为&p[0][1],*(p[0]+1)即为n[0][1]=20 p为二级指针,*p为数组第一行首地址即为p[0],(*p)[2]即为p[0][2]=n[0][2]=30 n[][3] 会确定为 n[2][3] 结构, int(*p)[3] 其中p 的含义是,就是指向一个含有3个元素的数组指针 令p=n,即 p=&n[0] 来源: https://www.cnblogs.com/kxzh/p/8576417.html

(超级棒)多级指针的使用【指针的总结②】

旧巷老猫 提交于 2020-01-31 04:10:15
(超级棒)C++基础·笔记——多级指针的使用【指针的总结②】 ~QQ:3020889729 ~小蔡 一级指针的复习 声明方式 一级指针的理解 二级指针的理解 声明方式 二级指针的认识(理解) 二级指针的操作 多级指针的拓展 总结 指针的个人理解:(打个比方,去指定的位置取东西) ~QQ:3020889729 ~小蔡 一级指针的复习 声明方式 方式: 数据类型* 变量名 = 地址 ; (Example:int* p = &a;) #include "iostream" using namespace std; int main() { int a = 0;//初始化为0 int* p = &a;//指针声明,务必初始化地址 //也可以这样:int* p = NULL; p = &a; *p = 8;//修改地址上的数据 cout << "a = " << a << endl;//输出此时a的值 cout << "*p = " << *p << endl;//输出指针p的值 return 0; } 一级指针的理解 一级指针可以理解是 某一个地址的操作符 ——可以对该地址上的内容(数据)进行修改。 二级指针的理解 声明方式 方式:数据类型** 变量名 = 指针的地址/地址的地址;(Example:int* q = &a; int** p = &q; ) #include

Record20—二级指针的输出模型

蓝咒 提交于 2020-01-18 03:11:45
目录 二级指针作输出模型 总体代码 二级指针作输出模型 指针做输出:被调用函数分配内存 下面这个例子,就是一个使用二级指针作输出的典型例子: int getMem(char **myp1, int *mylen1, char **myp2, int *mylen2) { char *tmp1 = NULL; char *tmp2 = NULL; tmp1 = (char *)malloc(100); if (tmp1 == NULL) { return -1; } strcpy(tmp1, "abcdefg"); *mylen1 = strlen(tmp1); *myp1 = tmp1; //间接修改实参p1的值 tmp2 = (char *)malloc(100); if (tmp2 == NULL) { return -2; } strcpy(tmp2, "11122233333"); *mylen2 = strlen(tmp2); *myp2 = tmp2; //间接修改实参p1的值 return 0; } int getMem_Free(char **myp1) { /* if (myp1 == NULL) { return ; } free(*myp1); //释放完指针变量 所致的内存空间 *myp1 = NULL; //把实参修改成nULL */ char *tmp

【424】C语言二级指针

谁说胖子不能爱 提交于 2020-01-15 23:54:23
参考: C 指向指针的指针 指向指针的指针是一种多级间接寻址的形式,或者说是一个指针链。通常,一个指针包含一个变量的地址。当我们定义一个指向指针的指针时,第一个指针包含了第二个指针的地址,第二个指针指向包含实际值的位置。 一个指向指针的指针变量必须如下声明,即在变量名前放置两个星号。例如,下面声明了一个指向 int 类型指针的指针: int **var; 当一个目标值被一个指针间接指向到另一个指针时,访问这个值需要使用两个星号运算符,如下面实例所示: var:int 变量 ptr:指向 var 的指针 pptr:指向 ptr 的指针 表示 var 值的三种方法: var *ptr:ptr 指针所对应的值,即 var **pptr:*pptr 指针所对应的值,即 ptr,所以 **pptr = *ptr = var 表示 ptr 值(var 地址,pptr 对应的值)的四种方法: &var:表示 var 的地址,即 ptr ptr &(*ptr):*ptr 相当于 var *pptr:*pptr 指针所对应的值,即 ptr,所以 *pptr = ptr = &var 表示 pptr 值(ptr 地址)的三种方法: &ptr:表示 ptr 的地址,即 pptr pptr &(*pptr):*pptr 相当于 ptr 表示 pptr 地址的方法: &pptr #include

C/C++二维数组名和二级指针

柔情痞子 提交于 2020-01-14 06:33:15
转载 : https://blog.csdn.net/wu_nan_nan/article/details/51741030 作者:吴一奇 1. 指针 1.1 一个指针包含两方面:a) 地址值;b) 所指向的数据类型。 1.2 解引用操作符(dereference operator)会根据指针当前的地址值,以及所指向的数据类型,访问一块连续的内存空间(大小由指针所指向的数据类型决定),将这块空间的内容转换成相应的数据类型,并返回左值。 有时候,两个指针的值相同,但数据类型不同,解引用取到的值也是不同的,例如, char str[] ={0, 1, 2, 3}; /* 以字符的ASCII码初始化 */ char * pc = &str[0]; /* pc指向str[0],即0 */ int * pi = (int *) pc; /* 指针的“值”是个地址,32位。 */    此时,pc和pi同时指向str[0],但*pc的值为0(即,ASCII码值为0的字符);而*pi的值为50462976。或许把它写成十六进制会更容易理解:0x03020100(4个字节分别为3,2,1,0)。我想你已经明白了,指针pi指向的类型为int,因此在解引用时,需要访问4个字节的连续空间,并将其转换为int返回。 2. 数组 2.1 数组名和指针 通常我们认为数组名是一个指针常量(例如,int a[10

二级指针做函数参数

大兔子大兔子 提交于 2019-12-18 22:18:01
本文将介绍二级指针做函数输出以及做函数输入的三种内存模型从内存四区的角度对程序执行的过程进行剖析,通过这中方式来加深对指针的理解。 二级指针做输出(在被调函数中分配内存)模型: 主函数: int main ( ) { char * p = NULL ; int len = 0 ; getMem ( & p , & len ) ; printf ( "p=%s\n" , p ) ; FreeMem ( & p ) ; return 0 ; } getMem函数: int getMem ( char * * myp , int * mylen ) { char * temp = NULL ; temp = ( char * ) malloc ( 100 ) ; if ( temp == NULL ) { return - 1 ; } strcpy ( temp , "abcdefg" ) ; * mylen = strlen ( temp ) ; * myp = temp ; return 0 ; } 犯的错误: *myp = temp; 最初写成了 *myp = *temp; 而该表达式赋值两端根本不是一种数据类型。 *myp = temp1; 这句话与 *mylen = 某一数值 本质上是一样的,都是 * 加上指针变量来改变主调用函数中的内容只不过, myp

二级指针做输入的四种内存模型(一)

匿名 (未验证) 提交于 2019-12-03 00:22:01
二级指针做输入的第一种内存模型: #include<stdio.h> int main() { char *buffer[]={"111","333","222"}; } 在上面的代码中buffer[ ]是不是一个数组呢?很明显是。只不过buffer[ ]中的每一个元素都是指针,也就是我们所说的指针数组。 首先我们进行打印,代码如下: #include<stdio.h> int main() { int i,num; char *buffer[]={"111","333","222"}; num=sizeof(buffer)/sizeof(buffer[0]);//求数组长度 for(i=0;i<num;i++) { printf("%s"\n,buffer[i]); //或printf("%s"\n,*(bufer+i)。因为buffer[i]是不是等价于*(buffer+i)呢? } } 我们如何对上面的元素进行排序呢?代码如下: 这样我们是不是通过交换指针实现了排序?也就是说交换了buffer中的元素。 在上述代码中,我们都是在main()中实现打印及排序,但为了使程序的可移植性更高,我们是不是应该自定义函数,实现上述功能呢? 自定义打印代码如下: } int main(){ int num; char *buffer[]={"111","333","222"};

指针参数传递实质及二级指针使用

匿名 (未验证) 提交于 2019-12-03 00:18:01
转自: https://blog.csdn.net/u013187074/article/details/52718619 水平有限,如有错误,欢迎指正,谢谢。 先看两个程序 : 耐心仔细看,应该能理解。 1 : void test(char *p) { } int main() { } 输出结果: 注意:( test 函数的 pde 值已改变, main 函数的 a 的值未改变) main1][a]:0xbfeaaef6. [main2][a]:abcde. [test1][p]:0xbfeaaef6. [test2][p]:abcde. [test3]malloc之后….. [test4][p]:0x8a52008. [test5][p]:ABCDE. [main3][a]:0xbfeaaef6. 2 : void test(char **p) { } int main() { } 输出结果: 注意:( test 函数的 pde 值已改变, main 函数的 a 的值也已经改变) [main1][a]:0xbfaca776. [main2][a]:abcde. [test1][p]:0xbfaca770. [test2][*p]:0xbfaca776. [test3]malloc之后….. [test4][p]:0xbfaca770. [test5][*p]:0x9132008

C++二级指针和指针引用

匿名 (未验证) 提交于 2019-12-02 23:59:01
已经清晰一级指针和引用。 可参考: 指针和引用与及指针常量和常量指针 或查阅其他资料。 个人觉得文字描述比较难读懂,直接看代码运行结果分析好些,如果想看文字分析,可参考文末参考文章。 #include <iostream> using namespace std; void make(int **pp) { **pp = 66;//这样只是改变了指向的值,即a, 指向没有改变 } int main() { int a=5; int *q=&a; int **pp=&q; cout<<"address:"<<&pp<<" "<<pp<<" "<<&q<<" "<<q<<" value:"<<*q<<" "<<a<<endl; //可将下面的注释去掉运行通过结果对比查看一级指针与二级指针的关系 // cout<<*pp<<" "<<&*pp<<" "<<*&pp<<" "<<**pp<<endl; make(pp); cout<<"address:"<<&pp<<" "<<pp<<" "<<&q<<" "<<q<<" value:"<<*q<<" "<<a<<endl; return 0; } 运行结果: 如果改为: #include <iostream> using namespace std; void make(int **pp) { int * p=new int(66);

c/c++二级指针动态开辟内存

▼魔方 西西 提交于 2019-11-29 23:41:15
c版: #include <stdio.h> #include <stdlib.h> #define row 4 #define col 8 int main() { int **p; int i,j; //p[4][8] //开始分配4行8列的二维数据 p = malloc(sizeof(int *)*row); for(i=0;i<row;i++){ p[i]= malloc(sizeof(int)*col); } //初始化 for(i=0; i<row; i++){ for(j=0; j<col; j++){ p[i][j] = j*i; } } //打印数据 for(i=0; i<row; i++){ for(j=0; j<col; j++) { if(j==0) printf("\n"); printf("%d \t",p[i][j]); } } //开始释放申请的堆 for(i=0; i<row; i++){ free(p[i]); } free(p); return 0; } c++版: #include <iostream> using namespace std; int main() { int **p; int i,j; //p[4][8] //开始分配4行8列的二维数据 p = new int *[4]; for(i=0;i<4;i++){ p[i]