指针变量

时间:2024-03-05 21:59:53编辑:奇事君

C语言中“指针”和“指针变量”的区别是什么??

1、概念不同“指针”是概念,“指针变量”是具体实现,指针也是一个变量,所以需要进行定义,而对于指针的定义,与一般变量一样。2、 存放地址不同一个变量的(内存)地址称为该变量的“指针”,通过指针能找到以它为地址的内存单元。而指针变量是用来存放另一个变量的地址的(即指针)。扩展资料:指针和指针变量的关系1、指针就是地址,地址就是指针。2、地址就是内存单元的编号。3、指针变量就是存放内存地址的变量。4、指针和指针变量是两个不同的概念,但要注意的是,通常我们叙述时会把指针变量简称为指针,实际他们含义并不一样。注:指针里存的是100. 指针:地址 - 具体。指针里存的是地址,指针:指针变量 -可变。指针的好处:1、直接访问硬件2、快速传递数据(指针表示地址)3、返回一个以上的值返回一个(数组或者结构体的指针)4、表示复杂的数据结构(结构体)5、方便处理字符串6、指针有助于理解面向对象

C语言中的指针到底有什么用

所有变量值保存在内存中,而每个内存都有一个地址,所谓地址就是一个整数编号,如同门牌号码用于定位(专业术语叫寻址),一个地址对应一个字节(8bit)的内存单元。

如今的编译器,一个整数int类型的值占用32位bit,也就是4字节,编译器将第一个字节的编号定义为该整数的地址,由于保存地址的变量就像一个箭头指向某地址,而称为指针变量。

int a =10; //定义一个整数变量a,对其赋值10
int *p =&a;//定义一个指针变量p,对其赋值a的内存地址,&符号意思为引用跟随其后的变量地址。

cout <<a<<endl; //输出 a的值:10
cout << p << endl ;// 输出p的值:XXXXX 其实为a的地址,该地址由编译器和运行时确定。
cout << *p <<endl; //输出p指向的地址中的值:10,也就是a的值,*星号放在变量前面意思就是取该变量中的地址所指内存中的值。
读取过程为:p的值(a的地址)->寻址->取值

由于指针是一个变量的首个字节的地址,所以要告诉编译器被指地址包含连续多少个字节,因此指针也有类型。比如上面例子中声明了p指针是个整数指针,这样编译器知道p指向一个4字节的内存块。

你可以将指针变量看做一般的整数变量来理解,用来保存一个整数(地址是个整数),只是,该整数代表着某地址,在这里是a的地址。

在C/C++中很灵活,但是也很危险,也很难学,如果指针指向错误的地址会引起程序崩溃,因此在C#中已经被微软封装了,但内部还是有指针的。

如果有必要,C#中也可以使用指针,使用非安全代码,在项目生成选项卡中勾选“允许非安全代码”,然后就可以使用指针了,不过不建议这么做。
unsafe
{
int a = 10;
int* p=&a;
}


指针变量赋值方式

指针变量赋值有三种方式:int i1、i2以及i3。1、nt *p1=&i1,*p2=i2; 用整形变量的地址给基类型为整形的指针变量赋值。2、p1=&i3; 给指针变量赋予变量的地址。3、p1=p2; 通过指针变量给指针变量赋值。存放地址的变量称为指针变量。指针变量是一种特殊的变量,它不同于一般的变量,一般变量存放的是数据本身,而指针变量存放的是数据的地址。扩展资料:指针变量赋值三种方式实例:1、方式一:int i1i=3;*i_pointer=3; 2、方式二:int i2int i,j;int *pointer_1,*pointer_2;pointer_1 = &i;pointer_2 = &j; 3、方式三:int i3#include void main(){ char *string = “I love China!”;printf(“%s\n”,string);}参考资料来源:百度百科:指针变量

怎么把数组赋值给指针变量

1. 怎么将一组数组赋值给指针,比如, a[][3]={2,4,5,6,7,8,9,10,11} *p(3)
指针变量可以指向一维数组中的元素,也可以指向多维数组中的元素。

但在概念和使用上,多维数组的指针比一维数组的指针要复杂。1、二维数组的地址 二维数组可以理解为一个广义的一维数组,一个以一维数组为元素的一维数组。

例如定义一个数组:int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12}; 则数组a对应的元素为:a[0][0] a[0][1] a[0][2] a[0][3] …… 第0行 a[1][0] a[1][1] a[1][2] a[1][3] …… 第1行 a[2][0] a[2][1] a[2][2] a[2][3] …… 第2行 现在将第0行数组元素a[0][0]、a[0][1]、a[0][2]、a[0][3]组成数组a[0],第1行数组元素a[1][0]、a[1][1]、a[1][2]、a[1][3]组成数组a[1],第2行数组元素组成数组a[2],则a[0]、a[1]、a[2]就是一维数组名,代表一个地址常量,分别指向每行的第0列元素,如图 7 7和图 7 8所示。那么a[0]+1指向第0行的第1个元素,a[1]+1指向第1行的第1个元素,所以称a[0]、a[1]、a[2]为列指针,对它们的增减1将移动1列元素。

图 7 8 二维数组中元素地址示意图 对于二维数组a来说,还可以把它看成是由a[0]、a[1]、a[2]这些“元素”组成的一维数组,如图 7 8所示。而a[0]、a[1]、a[2]又是由4个int型元素组成的数组,所以a+0指向a[0]数组的首地址(第0行元素的首地址),a+1指向a[1]数组的首地址(第1行元素的首地址),那么a+i指向第i行的首地址,所以a被看成是一个行指针,指针a的基类型是一个由4个int型数据构成的数组。



由于a指向a[0],a+1指向a[1],所以*a等价于a[0],*(a+1)等价于a[1],*(a+i)等价于a[i],行指针*运算得到列指针。而a[0]+1指向第0行的第1个元素,a[1]+1指向第1行的第1个元素,那么*(a[0]+1)等价于a[0][1],*(a[1]+1)等价于a[1][1],*(a[i]+j)等价于a[i][j],列指针*运算得到二维数组的元素值。

而a[i]又等价于*(a+i),所以*(a[i]+j)与*(*(a+i)+j)等价,都表示二维数组元素a[i][j]。对于二维数组a[M][N]中的任意一个元素a[i][j],其地址可以表示为:(1)&a[i][j],(2)&a[0][0]+i*N+j,(3)a[i]+j等价于*(a+i)+j (4)a[0]+ i*N+j 对于二维数组a[M][N]中的任意一个元素a[i][j],还可以表示成*(a[i]+j)、*(*(a+i)+j)、(*(a+ i))[ j]、*(a[0]+ i*N+j)、*(&a[0][0]+i*N+j)等形式。

【例7- 8】通过数组元素的地址来引用二维数组元素。#include #include int main() { int i,j; int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12}; cout<<"输出二维数组a:"<

在指向行的指针前面加一个*运算,就转换为指向列的指针;反之,在指向列的指针前面加一个&运算,就成为指向行的指针。(2) *(a+i)和a[i]是等价的,但它们在各维数组中的含义不同:对于一维数组a,*(a+i)和a[i]是一个元素;而对于二维数组a,*(a+i)和a[i]则仍然是一个地址,*(*(a+i)+j)才是元素a[i][j],*(*(a+i+j))也是元素,但它是a[i+j][0]元素。

2、二维数组的指针 同样还可以用指针变量来访问二维数组元素。由于二维数组的地址有行地址和列地址两种,所以和地址相对应的指针也有两种,分别为行指针和列指针。

(1)二维数组的列指针 列指针是指向具体元素的指针,又称一级指针,其定义和一般变量指针的定义是一样的。在例7.8程序中增加一行列指针定义语句:int *aPtr=a[0]; 或int *aPtr=&a[0][0] 将例7.8程序中输出数组元素的语句cout<

 直接移动指针:cout<

在定义时,必须明确指出这个指针指向的一维数组有多少个元素。用行指针来处理二维数组,则行指针所指数组的长度等于二维数组的列数。

行指针定义的一般形式如下: (* )[ ] 其中 即表示该指针指向的数组的长度。【例7- 9】通过行指针来引用二维数组元素。

#include int main() { int i,j; int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12}; int (*p)[4]; 定义一个指向一维数组(有4个整型元素)的指针变量 p=a; couti; cout>j; cout<<"a["< 列标号:2 a[1][2]=7。
2. 怎么向指针数组中赋值
不可以

原因很简单

"one","two"是存在静态存储区的,这个地址中的值不能被修改。

*(p[1]+1)=getchar();

运行这句,程序应该崩溃

也就是说这种声明:char *p[]={"one","two"};

是不能修改其中指针指向地址中的值的,只能读取



char p[][5]={"one","two"};

这种声明,变量则是存在栈上的,这时就可以

*(p[1]+1)=getchar();

来修改
3. 数组可以赋值给指针吗
可以。

指针作为实体,是一个用来保存一个内存地址的计算机语言中的变量。 数组,是有序的元素序列。

若将有限个类型相同的变量的 *** 命名,那么这个名称为数组名。组成数组的各个变量称为数组的分量,也称为数组的元素,有时也称为下标变量。

数组名可以代表数组的首地址,num就是num数组的首地址,pn声明为一个指针变量,它的值直接指向(points to)存在电脑存储器中另一个地方的值,也就是个地址。因此num的值是可以赋值给pn的。

扩展资料: 数组使用规则 1.数组的类型实际上是指数组元素的取值类型。对于同一个数组,其所有元素的数据类型都是相同的。

2.数组名的书写规则应符合标识符的书写规定。 3.数组名不能与其它变量名相同。

4、只能给元素逐个赋值,不能给数组整体赋值。例如给十个元素全部赋1值,只能写为:static int a[10]={1,1,1,1,1,1,1,1,1,1};而不能写为:static int a[10]=1;(请注意:在C、C#语言中是这样,但并非在所有涉及数组的地方都这样,数据库是从1开始。)

参考资料: 百度百科-数组 百度百科-指针。
4. 数组可以赋值给指针吗
可以。

指针作为实体,是一个用来保存一个内存地址的计算机语言中的变量。

数组,是有序的元素序列。若将有限个类型相同的变量的 *** 命名,那么这个名称为数组名。组成数组的各个变量称为数组的分量,也称为数组的元素,有时也称为下标变量。

数组名可以代表数组的首地址,num就是num数组的首地址,pn声明为一个指针变量,它的值直接指向(points to)存在电脑存储器中另一个地方的值,也就是个地址。因此num的值是可以赋值给pn的。

扩展资料:

数组使用规则

1.数组的类型实际上是指数组元素的取值类型。对于同一个数组,其所有元素的数据类型都是相同的。

2.数组名的书写规则应符合标识符的书写规定。

3.数组名不能与其它变量名相同。

4、只能给元素逐个赋值,不能给数组整体赋值。例如给十个元素全部赋1值,只能写为:static int a[10]={1,1,1,1,1,1,1,1,1,1};而不能写为:static int a[10]=1;(请注意:在C、C#语言中是这样,但并非在所有涉及数组的地方都这样,数据库是从1开始。)


上一篇:电磁学

下一篇:地球的资料