C语言指针
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言指针相关的知识,希望对你有一定的参考价值。
就是我想知道 具体的指针是什么意思 要那种flash动画的 一步一步讲解的 我搞不清楚指针运算时候的顺序
严格地说,一个指针是一个地址,是一个常量。而一个指针变量却可以被赋予不同的指针值,是变量。但常把指针变量简称为指针。为了避免混淆,我们中约定:“指针”是指地址,是常量,“指针变量”是指取值为地址的变量。定义指针的目的是为了通过指针去访问内存单元。既然指针变量的值是一个地址,那么这个地址不仅可以是变量的地址,也可以是其它数据结构的地址。在一个指针变量中存放一个数组或一个函数的首地址有何意义呢? 因为数组或函数都是连续存放的。通过访问指针变量取得了数组或函数的首地址,也就找到了该数组或函数。这样一来,凡是出现数组,函数的地方都可以用一个指针变量来表示,只要该指针变量中赋予数组或函数的首地址即可。这样做,将会使程序的概念十分清楚,程序本身也精练,高效。在C语言中,一种数据类型或数据结构往往都占有一组连续的内存单元。 用“地址”这个概念并不能很好地描述一种数据类型或数据结构,而“指针”虽然实际上也是一个地址,但它却是一个数据结构的首地址,它是“指向”一个数据结构的,因而概念更为清楚,表示更为明确。 这也是引入“指针”概念的一个重要原因。
10.2 变量的指针和指向变量的指针变量
变量的指针就是变量的地址。存放变量地址的变量是指针变量。即在C语言中,允许用一个变量来存放指针,这种变量称为指针变量。因此,一个指针变量的值就是某个变量的地址或称为某变量的指针。
为了表示指针变量和它所指向的变量之间的关系,在程序中用“*”符号表示“指向”,例如,i_pointer代表指针变量,而*i_pointer是i_pointer所指向的变量。
谭浩强书上的讲解,比较详细,可以找这本书看下,希望对你有帮助,指针比较难,需要多看多思考多敲代码,渐渐就掌握了 参考技术A 指针就是内存地址, 变量的地址
int a; // a是一个变量, 假设a放在内存的0x12345678这个位置
int* p = &a // p就是a的内存地址, p的值就是0x12345678, &是取地址的意思
*p = 10 // 将内存地址为0x12345678的变量数据改为10, '*'叫做解引用, 意思是访问该地址
// 解释为" 0x12345678这个位置有一个int变量, 把它取出来, 赋予10的值"
a = 10; // 上面那句等价于这一句
int b; // b是另一个变量, 假设b放在内存的0x87654321这个位置
p = &b; // p 现在指向b了, 等于0x87654321
p+1; // 把p的值向后移动一位, 因为int类型为4个字节(一般来说),
// 这时p等于0x87654321 + 4 = 0x87654325
// p指向了b之后的位置, 当然这个位置还没有任何变量
int array[10] // array是一个数组, 有10个元素
p = array; // p 指向, 第一个元素的地址
p = & (array[0]) // 这句等于上面那句, 因为标准规定" 数组的名字代表他第一个元素的地址"
p+1 // p现在指向数组第二个元素了, 数组在内存里每个元素的地址是连续的
p+1 // p现在指向数组第三个元素
*p = 5; // 数组第三个元素设为5
在32位系统中一个地址的长度是32为, 16进制 0x 12345678这样
在64位系统中一个地址的长度是64为, 16进制 0x 1234567812345678这样 参考技术B 比如说:
*p=&a;
a=3
所以*p为3
意思就是说a的值是3
*p是指向a地址的一个值
也就是说p是个地址 和 &a是一样的 比如a的地址是00ffH 这是个地址(我随意写的,计算机会自动分配地址) 而a的地址的值是3 那么p地址的值也是3 所以*p就是三 参考技术C 每个内存单元都是有一个地址的,计算机内部真正的存取是通过地址实现的,指针就是内存单元的地址。 参考技术D 指针就是地址 第5个回答 2012-05-12 记住指针变量存储的是地址
C语言,怎么把一个指针的内容复制到另一个指针?
struct student
char name[20];
int grade;
struct student *next;
;
struct student *Reverse(struct student *head)
int grade;
char nam[20];
struct student *p1,*p2,*head2;
head2=NULL;
p1=head;
while(p1!=NULL)
p2=(struct student *)malloc(sizeof(struct student));
grade=p1->grade,strcat(nam,p1->name);
※ p2->grade=grade,p2->name=nam);
p2->next=head2,head2=p2;
p1=p1->next;
return(head2);
c的那行,Lvalue reqrired
改成,strcat(p2->name,nam);可以吗?
想把p1的内容写到p2里面去。是创建新链表,不是改原来的链表,。
直接对指针进行赋值即可实现把一个指针的内容复制到另一个指针。
下面举例来说明具体的操作过程:
int *p1=(int *)malloc(sizeof(int)); // 定义一个int类型的指针变量p1,并分配存储单元int *p2; // 定义一个int类型的指针变量p1,没有分配存储单元
*p1 = 4; // 对指针p1指向的存储单元赋值
p2 = p1; // 将指针p2也指向指针p1指向的存储单元,即*p2=4
printf("%d", *p2); // 输出4 参考技术A strcpy(nam,p1->name);
p2->grade=grade;
strcpy(p2->name,nam);
strcat 是连接两个字符串的,如果多连接几个, nam就会溢出数组了……
strcpy 才是拷贝字符串的正确函数。本回答被提问者采纳 参考技术B 结构体的好处就是,他可以直接赋值,所以
grade=p1->grade,strcat(nam,p1->name);
※ p2->grade=grade,p2->name=nam);
可以直接*p2 = *p1;
你试试 参考技术C 应该用strcpy()复制字符串:
strcpy(p2->name,p1->name);
以上是关于C语言指针的主要内容,如果未能解决你的问题,请参考以下文章