Con trỏ có nhiều khái niệm nhưng dễ dàng và chúng rất quan trọng đối với lập trình C. Các khái niệm con trỏ quan trọng sau đây phải rõ ràng đối với bất kỳ lập trình viên C nào

Một con trỏ trong C là một địa chỉ, là một giá trị số. Do đó, bạn có thể thực hiện các phép toán số học trên một con trỏ giống như bạn có thể thực hiện trên một giá trị số. Có bốn toán tử số học có thể được sử dụng trên con trỏ: ++, --, + và -

Để hiểu con trỏ số học, chúng ta hãy coi ptr là một con trỏ số nguyên trỏ đến địa chỉ 1000. Giả sử số nguyên 32 bit, chúng ta hãy thực hiện phép toán số học sau trên con trỏ: ptr++
Sau thao tác trên, ptr sẽ trỏ đến vị trí 1004 vì mỗi lần ptr được tăng lên, nó sẽ trỏ đến vị trí số nguyên tiếp theo cách vị trí hiện tại 4 byte. Thao tác này sẽ di chuyển con trỏ đến vị trí bộ nhớ tiếp theo mà không ảnh hưởng đến giá trị thực tại vị trí bộ nhớ đó. Nếu ptr trỏ đến một ký tự có địa chỉ là 1000, thì thao tác trên sẽ trỏ đến vị trí 1001 vì ký tự tiếp theo sẽ có sẵn ở 1001.

1. Tăng một con trỏ

Chương trình sau tăng con trỏ biến để truy cập từng phần tử kế tiếp của mảng:

#
#include <stdio.h>

const int MAX = 3;

int main () {

int nNumbers[] = {10, 100, 200};
int i, *ptr;

/* let us have array address in pointer */
ptr = nNumbers;
for ( i = 0; i < MAX; i++) {

printf("Address of nNumbers[%d] = %x\n", i, ptr );
printf("Value of nNumbers[%d] = %d\n", i, *ptr );

/* move to the next location */
ptr++;
}
return 0;
}

Kết quả thực thi của chương trình:

Address of nNumbers[0] = dab143c
Value of nNumbers[0] = 10
Address of nNumbers[1] = dab1440
Value of nNumbers[1] = 100
Address of nNumbers[2] = dab1444
Value of nNumbers[2] = 200

2. Giảm con trỏ

Cách tính tương tự được áp dụng cho việc giảm con trỏ, làm giảm giá trị của nó theo số byte của kiểu dữ liệu của con trỏ:

#include <stdio.h>

const int MAX = 3;

int main () {

int nNumbers[] = {10, 100, 200};
int i, *ptr;

/* let us have array address in pointer */
ptr = &nNumbers[MAX-1];
for ( i = MAX; i > 0; i--) {

printf("Address of nNumbers[%d] = %x\n", i-1, ptr );
printf("Value of nNumbers[%d] = %d\n", i-1, *ptr );

/* move to the previous location */
ptr--;
}
return 0;
}

Kết quả thực thi chương trình:

Address of nNumbers[2] = 5899444
Value of nNumbers[2] = 200
Address of nNumbers[1] = 5899440
Value of nNumbers[1] = 100
Address of nNumbers[0] = 589943c
Value of nNumbers[0] = 10

3. So sánh con trỏ

Con trỏ có thể được so sánh bằng cách sử dụng các toán tử quan hệ, chẳng hạn như ==, < và >. Nếu p1 và p2 trỏ đến các biến có liên quan với nhau, chẳng hạn như các phần tử của cùng một mảng, thì p1 và p2 có thể được so sánh với nhau.
incrementing the variable pointer so long as the address to which it points is either less than or equal to the address of the last element of the array, which is &var[MAX - 1]
Chương trình sau  tăng con trỏ biến miễn là địa chỉ mà nó trỏ tới nhỏ hơn hoặc bằng địa chỉ của phần tử cuối cùng của mảng, là &var[MAX - 1] 

#include <stdio.h>

const int MAX = 3;

int main () {
int nNumbers[] = {10, 100, 200};
int i, *ptr;
/* let us have address of the first element in pointer */
ptr = nNumbers;
i = 0;
while ( ptr <= &nNumbers[MAX - 1] ) {
printf("Address of nNumbers[%d] = %x\n", i, ptr );
printf("Value of nNumbers[%d] = %d\n", i, *ptr );
/* point to the next location */
ptr++;
i++;
}
return 0;
}

Kết quả thực hiện chương trình:

Address of nNumbers[0] = 577744c
Value of nNumbers[0] = 10
Address of nNumbers[1] = 5777450
Value of nNumbers[1] = 100
Address of nNumbers[2] = 5777454
Value of nNumbers[2] = 200