① c语言高级指针,请来位大侠解答.
a. struct p的首地址值(取决于电脑、程序等因素)
b. struct p
c. x
d. 指向a的地址(该值见问题a)的指针的地址(指针的指针 的地址)
e. 不合法
f. 不合法
g. a的地址
h~k. 不合法
l. x
m. struct p
② c语言指针的概念
指针是C语言中广泛使用的一种数据类型。 运用指针编程是C语言最主要的风格之一。利用指针变量可以表示各种数据结构; 能很方便地使用数组和字符串; 并能象汇编语言一样处理内存地址,从而编出精练而高效的程序。指针极大地丰富了C语言的功能。 学习指针是学习C语言中最重要的一环, 能否正确理解和使用指针是我们是否掌握C语言的一个标志。同时, 指针也是C语言中最为困难的一部分,在学习中除了要正确理解基本概念,还必须要多编程,上机调试。只要作到这些,指针也是不难掌握的。
指针的基本概念 在计算机中,所有的数据都是存放在存储器中的。 一般把存储器中的一个字节称为一个内存单元, 不同的数据类型所占用的内存单元数不等,如整型量占2个单元,字符量占1个单元等, 在第二章中已有详细的介绍。为了正确地访问这些内存单元, 必须为每个内存单元编上号。 根据一个内存单元的编号即可准确地找到该内存单元。内存单元的编号也叫做地址。 既然根据内存单元的编号或地址就可以找到所需的内存单元,所以通常也把这个地址称为指针。 内存单元的指针和内存单元的内容是两个不同的概念。 可以用一个通俗的例子来说明它们之间的关系。我们到银行去存取款时, 银行工作人员将根据我们的帐号去找我们的存款单, 找到之后在存单上写入存款、取款的金额。在这里,帐号就是存单的指针, 存款数是存单的内容。对于一个内存单元来说,单元的地址即为指针, 其中存放的数据才是该单元的内容。在C语言中, 允许用一个变量来存放指针,这种变量称为指针变量。因此, 一个指针变量的值就是某个内存单元的地址或称为某内存单元的指针。图中,设有字符变量C,其内容为“K”(ASCII码为十进制数 75),C占用了011A号单元(地址用十六进数表示)。设有指针变量P,内容为011A, 这种情况我们称为P指向变量C,或说P是指向变量C的指针。 严格地说,一个指针是一个地址, 是一个常量。而一个指针变量却可以被赋予不同的指针值,是变。 但在常把指针变量简称为指针。为了避免混淆,我们中约定:“指针”是指地址, 是常量,“指针变量”是指取值为地址的变量。 定义指针的目的是为了通过指针去访问内存单元。
既然指针变量的值是一个地址, 那么这个地址不仅可以是变量的地址, 也可以是其它数据结构的地址。在一个指针变量中存放一
个数组或一个函数的首地址有何意义呢? 因为数组或函数都是连续存放的。通过访问指针变量取得了数组或函数的首地址, 也就找到了该数组或函数。这样一来, 凡是出现数组,函数的地方都可以用一个指针变量来表示, 只要该指针变量中赋予数组或函数的首地址即可。这样做, 将会使程序的概念十分清楚,程序本身也精练,高效。在C语言中, 一种数据类型或数据结构往往都占有一组连续的内存单元。 用“地址”这个概念并不能很好地描述一种数据类型或数据结构, 而“指针”虽然实际上也是一个地址,但它却是一个数据结构的首地址, 它是“指向”一个数据结构的,因而概念更为清楚,表示更为明确。 这也是引入“指针”概念的一个重要原因。
③ 有关C语言指针的问题,超难,高手进!!!
整个函数的作用是-->在以listelement * listpointer为单向链表头的单向链表中的最尾段动态申请一个listelement结构的空间来存放要求加进单向链表的int data数据.并返回该链表的头指针....
以下是对程序代码的详细解释...
listelement * AddItem (listelement * listpointer, int data) {
//listpointer指向需要执行加入数据的单向链表的指针.这个指针可以指向任一条数据结构为listelement的单向链表
//data指的是要加入单向链表的具体数据
listelement * lp = listpointer; //使lp指向即将进行链表编历的头指针,这句为关键语句!
if (listpointer != NULL) { //如果链单不止一个有效项...则...
while (listpointer -> link != NULL)
listpointer = (listelement *) listpointer -> link; //这两名加起来为一个循环体! 其作用是编历整个链表的项.并保证listpointer指向链表中的最后一项!逻辑规定链表中的最后一项的listpointer -> link为NULL 其中listpointer = (listelement *) listpointer -> link中的(listelement *)为强制数据类型转换!目的是100%确保link为指向listelement结构的指针...这句话其实在正常的逻辑下是多余的.除非link除了指向本链表的下一个数据项外,还有别的作用! 但这样的可能性很少....
listpointer -> link = (struct listelement *) malloc (sizeof (listelement)); //动态申请一个listelement结构空间,并把申请到的首地址作为listpointer -> link! 由于前面的循环体的作用,使得listpointer -> link确保为链单中的最后一项...
listpointer = listpointer -> link; //使listpointer指向最后一项的实体,以便加入指定data数据项....看,这句listpointer = (listelement *) listpointer -> link是多么的相似!?(其执行结果肯定是一样的) 从这里可以看出,在前面循环体内的(listelement *)肯定是多余的!!!
listpointer -> link = NULL; //使listpointer在逻辑上成为本链表的最尾部!
listpointer -> dataitem = data; //加入数据
return lp; //返回本链表的头指针! 这和函数的第一句是对应的,是关键语句,绝不能少的!
}
else { //如果链表为空,也就是一个数据项都没有的话,则动态申请一个,并把data数据加到里面保存,然后使刚动态生成的listpointer为链表头指针! (以下的语句作用是就如此,我不多说了)
listpointer = (struct listelement *) malloc (sizeof (listelement));
listpointer -> link = NULL;
listpointer -> dataitem = data;
return listpointer;
}
}
PS:在高级语言里,指针的强制类型转换是经常用到的技巧!但由于各编译器的不同,会造成很多意想不到的逻辑错误!!!(很多时候,你以为确实是按自己的意思转换成指定的类型了,但实际上却完全不是这么一回事! 并这个错误有时是很难很难检测到底是为什么的!!!) 指针,用好了天下无敌,用不好就是一滴老鼠屎搞臭一锅汤!!! 这样情况的应用,用汇编是最不容易出错的!
PS:举个在G++编译器里一个容易误解的指针例子...两个不同的指针定义-->char *lp=new char[255]; 和 char lp[255];
里具体语句的lp[1]的含义到底有什么样的区别!? 这个例子,相信很多人都会觉得是一样没区别的(这是在C++标准里说明的)...但实际上,如果是在G++编译器里的话.定义为char lp[255];中的lp[1]的意义就是以lp为头指针的下一个单元!在这里,是我们常规并正确的理解! 但是,如果宝义成char *lp=new char[255];的话,则在G++编译器里lp[1]无解(结果是随机乱指一通)!!!虽然编译时不会出错,但结果肯定是错误的! 解决的方法超级郁闷.只能通过lp++来一步步寻址!(而不能通过lp[n]的方式直接寻址,当然如果还有效率高的方法,但这在逻辑上很容易让人混乱,那就是先把lp[0]转成DWORD类型再加上n之后再强制转成相应的指针类型!)
④ c语言中指针强大的功能体现在哪里
楼上说的对啊,用指针就是用来直接操纵内存的,动态申请空间就是其中一个应用。
下面还有几种经典的用法:
1.指针变量作为函数参数,在函数中修改变量的值。这个不用指针很难实现(c++中有引用可以实现)
void swap(int * p1, int *p2)
{// 在函数中交换两个变量的值
int tmp;
tmp = *p1;
*p1 = *p2;
*p2 = tm;
}
2.
你如果想在函数中返回多个值,应该怎么办呢?
可以选择从主调函数中向被调用函数传入参数,等待返回结果。
举例:
void func(int *pa, int *pb, int *pc)
{// 你向函数中传入三个参数,可以得到三个返回值了。
……
}
3.指针的主要应用就是直接操纵内存,这样可以减少复制数据的时间。
struct Student
{
char name[10];
BOOL sex;
int score[10];
}
void func(struct Student *pst)
{// 传址,减少了数据复制的时间,
// 有时为了防止参数被修改,可以改为 struct Student const *pst
}
void func(struct Student stu)
{// 传值,需要把实参的值复制到stu中,有时耗费大量时间
}
4。
此外,还有常用到的数组,其实就是对内存直接操纵。其他的应用如指针与多维数组,指向函数的指针等。
⑤ C语言高级指针解读
类型为“返回值为int的函数指针”的指针数组,即这个数组的每一个元素都是一个指针,这个指针指向的值(*f[0] 这种情况)为一个返回值为int的函数指针。给你个例程把:
#include <stdio.h>
#include <stdlib.h>
int func1()
{
return 1;
}
int func2()
{
return 2;
}
int (*(*f[2]))();
int main()
{
f[0] = malloc(sizeof(int *));
f[1] = malloc(sizeof(int *));
*f[0] = func1;
*f[1] = func2;
printf("%d, %d\n", (*f[0])(), (*f[1])());
return 0;
}
⑥ C语言高级指针
可以。但更易出错,因此不太建议使用……
⑦ C语言指针变量比较
首先要 分清, 是在 声明中 还是在语句中。
声明中,例如:
int a=1, b=2;
int *p, *q; // 声明 *p 和 *q 是指针,用于指向 int 型数据。
p=&a; q=&b; //语句, p 和 q 是指针 指向的数据 的地址,p 指向 a, q 指向 b.
if ( p < q) printf("...."); // 语句, p 和 q 是 "地址", 地址大小的比较。即 &a,&b 的比较。
若是 if ( *p < *q) printf("...."); // 语句, *p 和 *q 是 "数值“ 的比较,即 a,b 的比较,现在 a=1,b=2。
即,语句中 有星号的是 数值,没星号的是地址。
你的2道题里,p,q 是 地址。是地址值的比较。
⑧ 关于C语言高级指针
ptr = &&succeed,是指向(指向succeed的指针)的指针。
后面go to *ptr。 *ptr 就是(指向succeed的指针)
ptr = &&failure。同理。
⑨ c语言指针
变量赋值 是得到副本,如
t=a;
a=b;
b=t;
指针 则是指向同一个内存地址
因而获得内存里面的内容
如后者