指针数组

c++数组与指针知识集锦

风格不统一 提交于 2020-02-05 09:24:49
1、 // by 鸟哥 qq1833183060 数组与指针 # include <iostream> using std :: cout ; int main ( ) { int a [ 10 ] { 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 } ; int j = 6 ; cout << a [ j ] << " " << * ( & a [ 0 ] + j ) << " " << * ( a + j ) << " " << * ( j + a ) << " " << j [ a ] << std :: endl ; } //输出为 7 7 7 7 7 运行结果: 7 7 7 7 7 来源: CSDN 作者: 鸟哥01 链接: https://blog.csdn.net/sinat_18811413/article/details/104138046

发一篇关于 数组名称 和 指针区别 的专题探讨

99封情书 提交于 2020-02-04 20:01:11
char p_arr[] = " p_arr : hello world " ; 声明一个数组时,编译器将根据声明所指定的元素数量为数组保留内存空间,然后再创建数组名,它的值时一个常量 ,指向这段空间的起始位置。 数组名是符号地址常量 ( 一个常量指针,这个值不能被改变 ) ,在编译时求值并存在编译器的符号表里面,其值就是个内存地址;所以可以认为程序没有给他分配空间,数组名只是代表了那个数组空间; 与指针不一样,指针指向一块空间, 同时指针本身也存储在某个空间 ;可以认为数组名存在在符号表里,符号表是编译器用的,我们管不到;p_arr和&p_arr值是一样的,本来对常量取地址是非法的,但是标准组织没有定对数组名取地址是非法还是合法,所以因编译器而异. 引用chinaunix上一个叫dump_crash会员的发言: C专家编程里解释的很好: 经典的错误:在一个文件定义了数组,却在另外一个文件声明其为指针。代码如下: /*File name: main.c*/ extern int* array; /*声明指针*/ int main(void) { array[0]=1; /*用指针访问数据*/ return 0; } /*File name: def.c*/ int array[5]={0}; /*定义的却是数组*/ 1。编译器对数组名和指针变量的处理方式

两数之和2:输入有序数组(leecode)(c++)

廉价感情. 提交于 2020-02-04 12:28:45
在一个有序数组中,找出两个数,使得两数之和等于目标值。数组下标从1开始。 输入: numbers = [5,6,7,8,9,10], target = 11 输出: [1,2] 解释: 5 与 6 之和等于目标值 11 。因此 index1 = 1, index2 = 2 。 1.1解题思路 有三种常见解法,一种是暴露和哈希表,可以参考博主写的这篇博客 https://blog.csdn.net/naibozhuan3744/article/details/104160305 。本文主要总结用双指针法,解决这个问题。因为这是一个有序数组,所以可以用双端指针,分别取数据,具体步骤如下: 1.1.1双端指针指向数组起始pstart和末尾位置pend 1.1.2如果这两个指针指向的数相加和为目标值,则顺序输出;否则继续比较 1.1.3如果两数之和小于目标值,则指向较小值的指针*pstart向前移动,直到找到满足目标值的两数为止; 1.1.4如果两数之和大于目标值,则指向较大值的指针*pend向左移动,直到找到满足目标值的两数为止。 1.2代码如下 1.2.1双指针解法(4ms,9.7MB) #include <iostream> #include <vector> #include <map> #include <iterator> using namespace std; /

c语言函数指针

人盡茶涼 提交于 2020-02-04 11:26:13
1.在讲这个问题之前,我们要明白一个问题。就是我们为什么要把一个函数的地址作为参数传递给另一个参数。要知道在C语言中,一个函数内部是可以直接调用其他函数的,既然可以直接调用,为什么还要用这么麻烦的办法去把函数当做参数来传递呢。下面我举个例子。 例如我们设计一个estimate() 的函数计算一个程序运行的时间,但不同的人估算时间的时候可能算法有所不同,算出的时间也应该不同。但我们都调用同一个estimate() 函数,现在该怎么办呢,重写estimate() 函数固然是一个办法,但是我们还有另外的办法,比如我们 把estimate()函数中计算时间的算法作为一个公共变量让其作为参数传入 ,我们只需要把 各自的计算时间的算法写成一个函数,再通过参数传递给estimate() ,而estimate()中的内容还是原来的不变,这样就可以实现不同的人计算出来的时间不同了。 2.既然知道了函数参数传递的用处,那么我们现在就来说一下它的用法。 首先参数传递分为两种,一种是 值传递 ,一种是 地址传递 。 一般我们传递时用的是地址传递。因为,若是采用值传递的话,比如我们传递一个数组 double a[100] ,则在调用函数的时候。编译器会 把这整个数组复制到函数中 ,这样使用的空间是 100*sizeof(double)=800 .若是我们只传递 数组名 a 这个地址 的话

《c++primer》笔记 第3章 字符串、向量和数组

廉价感情. 提交于 2020-02-03 09:52:04
标准库类型 本章重要的两个: string 和 vector ,以及配套的迭代器。 3.1 命名空间的using声明 using声明具有如下的形式: using namespace::name; 一旦声明了上述语句,就可以直接访问命名空间中的名字: #include<iostream> //using声明,当我们使用名字cin时,从命名空间std中获取它 using std::cin; int main() { int i; cin >> i;//正确:cin和std::cin含义相同 cout << i;//错误:没有对应的using声明,必须使用完整的名字 std::cout << i;//正确:显式地从std中使用cout return 0; } 用下面的using可以使用std里面的所有名字: using namespace std; 头文件不应包含using声明 3.2 标准库类型string 初始化string对象的方式 string s1; //默认初始化,si是一个空串 string s2(s1); //s2是s1的副本 string s2=s1; //等价于s2(sl>,s2是s1的副本 string s3("value"); //S3是字面值"value"的副本,除了字面值最后的那个空字符外 string s3="value"; //等价于s3("value")

指针函数与函数指针的区别

跟風遠走 提交于 2020-02-02 08:45:44
一、 在学习arm过程中发现这“指针函数”与“函数指针”容易搞错,所以今天,我自己想一次把它搞清楚,找了一些资料,首先它们之间的定义: 1、指针函数是指带指针的函数,即本质是一个函数。函数返回类型是某一类型的指针 类型标识符 *函数名(参数表) int *f(x,y); 首先它是一个函数,只不过这个函数的返回值是一个地址值。函数返回值必须用同类型的指针变量来接受,也就是说,指针函数一定有函数返回值,而且,在主调函数中,函数返回值必须赋给同类型的指针变量。 表示: float *fun(); float *p; p = fun(a); 注意指针函数与函数指针表示方法的不同,千万不要混淆。最简单的辨别方式就是看函数名前面的指针*号有没有被括号()包含,如果被包含就是函数指针,反之则是指针函数。 来讲详细一些吧!请看下面 指针函数: 当一个函数声明其返回值为一个指针时,实际上就是返回一个地址给调用函数,以用于需要指针或地址的表达式中。 格式: 类型说明符 * 函数名(参数 ) 当然了,由于返回的是一个地址,所以类型说明符一般都是int。 例如: int *GetDate(); int * aaa(int,int); 函数返回的是一个地址值,经常使用在返回数组的某一元素地址上。 int * GetDate(int wk,int dy); main() { int wk,dy; do {

指针函数与函数指针的区别

a 夏天 提交于 2020-02-02 08:45:27
一、 在学习arm过程中发现这“指针函数”与“函数指针”容易搞错,所以今天,我自己想一次把它搞清楚,找了一些资料,首先它们之间的定义: 1、指针函数是指带指针的函数,即本质是一个函数。函数返回类型是某一类型的指针 类型标识符 * 函数名(参数表) int *f(x ,y); 首先它是一个函数,只不过这个函数的返回值是一个地址值。函数返回值必须用同类型的指针变量来接受,也就是说,指针函数一定有函数返回值,而且,在主调函数中,函数返回值必须赋给同类型的指针变量。 表示: float *fun(); float *p; p = fun(a); 注意指针函数与函数指针表示方法的不同,千万不要混淆。最简单的辨别方式就是看函数名前面的指针*号有没有被括号()包含,如果被包含就是函数指针,反之则是指针函数。 来讲详细一些吧!请看下面 指针函数: 当一个函数声明其返回值为一个指针时,实际上就是返回一个地址给调用函数,以用于需要指针或地址的表达式中。 格式: 类型说明符 * 函数名(参数 ) 当然了,由于返回的是一个地址,所以类型说明符一般都是int。 例如: int *GetDate(); int * aaa(int,int); 函数返回的是一个地址值,经常使用在返回数组的某一元素地址上。 int * GetDate(int wk,int dy); main() { int wk,dy; do {

实验5 数组和指针

社会主义新天地 提交于 2020-02-02 07:26:23
part1:实验方式1: #include <stdio.h> const int N=5; int binarySearch(int x[], int n, int item); int main() { int a[N]={1,3,9,16,21}; int i,index, key; printf("数组a中的数据:\n"); for(i=0;i<N;i++) printf("%d ",a[i]); printf("\n"); printf("输入待查找的数据项: "); scanf("%d", &key); index = binarySearch(a, N, key); if(index>=0) printf("%d在数组中,下标为%d\n", key, index); else printf("%d不在数组中\n", key); return 0; } int binarySearch(int x[], int n, int item) { int low, high, mid; low = 0; high = n-1; while(low <= high) { mid = (low+high)/2; if (item == x[mid]) return mid; else if (item < x[mid]) high = mid - 1; else low =

Golang - 指针与引用

天大地大妈咪最大 提交于 2020-02-01 18:51:28
​ Golang有指针 , 那么一切数据都是值传递吗 ? 都需要用户进行指针传递吗, 其实不然, 对于Go语言, 虽然有指针, 但是其也有引用传递. 是不是很绕, 因为引用传递就是指针传递哇 . 我们继续解释. 概念 在Go语言中,对于 布尔变量 或 数值类型 或 字符串类型 或 数组 以及 struct 都是按照值传递的:值在传递给函数或者方法时会被复制一份,然后方法或函数使用的是复制的这份值,也就不会对原值产生什么影响。一般情况下,对于布尔变量或数值类型或字符串类型的按值传递是非常廉价的,Go语言编译器会在传递过程中进行安全优化。 对于大字符串是这样,对于数组进行值传递也是如此。为了解决可能产生的巨大代价,Go语言使用数组切片来代替数组的使用。传递一个切片的代价跟传递字符串差不多,无论该切片的长度或容量是多大。对切片进行复制修改操作也不会像字符串那样需要创建新的切片, 因为切片是可变的,属于引用类型 。 因此以下就是重点 : 语言中的值传递类型有:基本数据类型,数组 , struct 特点 :变量直接存储值,内存通常在栈中分配,栈在函数调用完会被释放 , 在调用函数时将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到实际参数 , 所以他最大的好处就是不怕多线程安全性问题. 但是浪费内存 Go语言中的引用类型有:映射(map),数组切片(slice)

c程序设计错题集

自作多情 提交于 2020-02-01 10:26:47
错题集 数组: 1.数组定义中,数组名后是用方括号括起来的常量表达式,不能用圆括号。(正确) 解析:数组标准样式array[ ],不能用array(); 2.函数strcmp从头至尾顺序地将其对应字符比较,遇到两个字符不等时,两个字符相减得到一个int型值,两个字符串完全相同时,则返回0。 (正确) 解析:用strcmp函数时头文件用#include<string.h> 在字符串比较时 如果相等时 返回int值0 如果字符串1>字符串2,则返回正整数 反之返回负整数。 3 .数组定义后,只能引用单个的数组元素,而不能一次引用整个数组。 (正确) 解析:数组只能用循环输出, 但是字符串数组可以用%s输出 4 .若有定义int a[]={2,4,6,8,10},a[1]和a++表示的含义相同。 (错误) 解析:a为数组名,数组名不能自增。 程序填空题: 1.选择法排序:本题要求将给定的nnn个整数从小到大排序后输出。输出时相邻数字中间用一个空格分开,行末不得有多余空格。 #include <stdio.h> #define MAXN 10 int main() { int i, index, k, n, temp; int a[MAXN]; scanf("%d", &n); for(i = 0; i < n; i++){ scanf("%d", &a[i]); } for(k = 0;